我可能完全忽略了这一点,但......
如何将'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传递给它。
答案 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”在这种情况下)将允许这样做。