我需要向一个函数传递一个匿名类型的对象。
我希望该对象包含一些属性,比如Name(string)和Rang(BO)。
说,我有一个像
这样的查询 Dim query = From city In _container.Cities
From street In city.Streets
Select Name = street.Name, Rang = street.Rang
Distinct
现在,我想将此查询的每个元素传递给函数。
有可能吗?
答案 0 :(得分:4)
是的,这是可能的。
您可以通过示例使用强制转换。这是一个示例:
class CastByExample {
public T Cast<T>(T t, object toCast) {
return (T)toCast;
}
public void M(object o) {
var y = Cast(new { Name = "Name", Range = 0 }, o);
Console.WriteLine(y.Name);
}
public void Test() {
var x = new { Name = "John Doe", Range = 17 };
M(x);
}
}
您也可以使用反射。
但实际上,如何跳过这些篮球比仅仅编写具体的非匿名类型更容易?
答案 1 :(得分:3)
总之,没有。来自MSDN:
“您不能将方法的字段,属性,事件或返回类型声明为具有匿名类型。同样,您不能将方法,属性,构造函数或索引器的形式参数声明为具有匿名类型。“ http://msdn.microsoft.com/en-us/library/bb397696.aspx
在方法之间传递匿名类型没有一种好方法(意思很简单)。我会创建一个帮助类。
话虽如此,您可能也会对Jon Skeet关于离开方法范围的匿名类型的文章感兴趣:
答案 2 :(得分:3)
无法在VB.Net中声明匿名对象的类型。但是,如果您对Option Strict Off
感到满意,那么您可以使用后期绑定。只需让目标方法接受Object
Public Sub UseAnonymousObject(ByVal p as Object)
Console.WriteLine(p.Name)
Console.WriteLine(p.Rang)
End Sub
...
For Each current in query
UseAnonymousObject(current)
Next
答案 3 :(得分:1)
我没有太多关注它们,我可能会忽略你的问题,但如果你在.Net 4框架上,你可以使用Tuples而不是匿名类型。他们似乎失去了明确的属性命名,这是很好的w / Anonymous类型,但它们确实有一个优势,因为它们可以传递给方法和从方法传递。
另一个缺点是,方法签名仍然需要使用正确的Tuple定义来定义。因此,在大多数情况下,我不确定它是否会因为使用非匿名类型而过多地购买,因为它在灵活性方面提供了什么,它阻碍了有意义的参数通信。
因此,我不建议将它们用于任何类型的广泛接口。 (例如,像Tuple这样的参数类型的公开暴露方法似乎更适合于过于模糊的Tuple参数的明确定义的类型定义)但它们可以很方便,而且我认为非常适合支持一次性的私有方法,ad-hoc类型对象。
答案 4 :(得分:0)
没试过,但是如何使用动态?
IEnumerable<dynamic> SubMethod(...)
{
....
return (IEnumerable<dynamic>) (from .... select new{Property1 = v1,...})
}
void Method()
{
var q = SubMethod().FirstOrDefault(); //or whatever
var j = q.Property1;
...
}