2

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

如何将“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'变量从每个子类传递给它。

4

3 回答 3

3

的类型wObject1(在上面写的代码中)。您可以通过将鼠标悬停在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
        }
    }
}
于 2010-03-28T16:33:28.360 回答
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" }),情况会变得更加复杂,因为这些类型没有您可以在代码中使用的名称(因此您不得不使用var),但由于您的代码不包含匿名类型,这对您来说应该不是问题。意识到这var是技术上与匿名类型无关的功能是很有用的。

于 2010-03-28T16:44:44.093 回答
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 引入了动态类型(在这种情况下特别是“鸭子类型”),这将允许这个。

于 2010-03-28T16:33:18.290 回答