将匿名类型作为参数传递给函数

时间:2011-09-09 17:48:43

标签: .net anonymous-types

我需要向一个函数传递一个匿名类型的对象。

我希望该对象包含一些属性,比如Name(string)和Rang(BO)。

说,我有一个像

这样的查询
  Dim query = From city In _container.Cities
               From street In city.Streets
               Select Name = street.Name, Rang = street.Rang
               Distinct

现在,我想将此查询的每个元素传递给函数。

有可能吗?

5 个答案:

答案 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关于离开方法范围的匿名类型的文章感兴趣:

http://blogs.msmvps.com/jonskeet/2009/01/09/horrible-grotty-hack-returning-an-anonymous-type-instance/

答案 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;
    ...
}