将'var'传递给另一个方法

时间:2010-03-28 16:24:45

标签: c# asp.net var

我可能完全忽略了这一点,但......

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

(我使用linq将XML加载到Enumerable对象列表中)。

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

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'varible传递给它。

3 个答案:

答案 0 :(得分:3)

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
        }
    }
}

答案 1 :(得分:3)

值得注意的是,没有像“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" }),情况会变得更复杂,因为这些类型没有您可以在代码中使用的名称(因此您不得不使用{{1但是,由于您的代码不包含匿名类型,这对您来说应该不是问题。有用的是要认识到var是技术上不以任何方式对匿名类型进行实现的功能。

答案 2 :(得分:2)

您的对象输入为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类型(特别是“duck typing”在这种情况下)将允许这样做。