【问题标题】:Passing a 'var' into another method将“var”传递给另一个方法
【发布时间】:2010-03-28 16:24:44
【问题描述】:

我可能完全错过了这里的重点,但是....

如何将“var”传递给另一个方法?

(我正在使用 linq 将 XML 加载到可枚举的对象列表中)。

我有不同的对象类型(具有不同的字段),但无论使用哪个对象,我的过程的最后一步都是相同的。

XNamespace xmlns = ScehmaName;
var result = from e in XElement.Load(XMLDocumentLocation).Elements(xmlns + ElementName)
             select new Object1
             {
                 Field1 = (string)e.Element(xmlns + "field1"),
                 Field2 = (string)e.Element(xmlns + "field2")
             };

var result2 = Enumerable.Distinct(result);

此代码会因要处理的不同类型的 XML 文件而异。但我想通过代码迭代检查各种问题:

foreach (var w in result2)
{
    if (w.CheckIT())
    {
        //do something
    }  
}

我想要的是在基类中的方法中的最后一步,我可以将“var”变量从每个子类传递给它。

【问题讨论】:

  • 不知道“CheckIT()”想做什么,这真的很难回答。

标签: c# asp.net var


【解决方案1】:

w 的类型是Object1(在上面写的代码中)。您可以通过将鼠标悬停在 var 关键字上并查看 Visual Studio 向您显示的工具提示来自己找到它。

很难从您的问题中看出,但听起来CheckIt 方法是在Object1 的基本类型上定义的。如果是,你可以编写你的方法来检查它们

protected void CheckAll<T>(IEnumerable<T> result) where T : <base type with CheckIt method>
{
    foreach(var w in result)
    {
        if(w.CheckIt())
        {
            // do something
        }
    }
}

【讨论】:

  • 本,你的假设是正确的。我会有 Object2、Object3 等。checkIt 方法定义在每个对象的基类中。
  • Ben,我似乎无法获得您提供的编译代码。它不喜欢代码的 部分
  • &lt;base type with CheckIt method&gt;替换为具有CheckIt方法的基类名称。
  • 噢!抱歉...那里有点厚...谢谢!现在就试试。
  • 非常感谢本。它满足了我的需要,而且效果非常好。
【解决方案2】:

值得注意的是,没有像“var”变量这样的东西。使用var 关键字声明的任何变量都具有实际类型(由编译器推断)。您只需不必显式编写此类型,但它仍然存在(编译器在开始处理您的代码时将var 声明替换为实际类型)。这意味着:

var n = 10 
// .. is exactly the same thing as:
int n = 10

在你的例子中:

var result = 
  from e in ... select new Object1 { ... };
// .. is exactly the same thing as:
IEnumerable<Object1> result = 
  from e in ... select new Object1 { ... };

如果您使用匿名类型(例如new { Name="Test" }),情况会变得更加复杂,因为这些类型没有您可以在代码中使用的名称(因此您不得不使用var 来处理它们),但是由于您的代码不包含匿名类型,因此这对您来说应该不是问题。意识到var 是一种技术上与匿名类型无关的功能是很有用的。

【讨论】:

    【解决方案3】:

    您的对象键入为Object1。您应该能够创建这样的方法:

    private void CheckAll(IEnumerable<Object1> result)
    {
        foreach(var w in result)
        {
            if(w.CheckIt())
            {
                // do something
            }
        }
    }
    

    并像这样使用它:

    CheckAll(result2);
    

    如果你的函数都处理不同的类型并且CheckIt 没有建立在一个通用的基本类型中,那么这在 C# 3 中是不可能的(没有反射)。C# 4 引入了 dynamic 类型(特别是“@987654322 @" 在这种情况下)将允许这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2016-02-13
      相关资源
      最近更新 更多