访问包含在匿名类型或Object类中的字段

时间:2015-12-16 10:57:13

标签: c# c#-4.0

我有一个返回如下的方法,

return new { a, b, c, d};

方法定义为public object GetValues(); 调用此方法后如何访问这些变量a,b,c,d?

4 个答案:

答案 0 :(得分:7)

两个选项:

  • 使用动态类型,只要您在同一个程序集中使用它:

    dynamic values = GetValues();
    var a = values.a; //etc
    
  • 直接使用反射;生成的类型将具有名为abcd

  • 的公共只读属性

或者,如果您可能将方法更改为不使用匿名类型,请执行此操作。 (您可能无法根据上下文更改方法的签名,但即使这样,您仍然可以使用调用代码。)

答案 1 :(得分:4)

如果您将其分配到dynamic,则可以将属性输出(请继续阅读,不要使用此代码):

dynamic d = YourMethodReturningAnonymousType();

var a = d.a;

请注意,您正在失去类型安全性,这是C#等类型安全语言的关键方面之一。我的建议:永远不要跨越方法的边界使用匿名类型。改为创建一个类并将其传递出去。

答案 2 :(得分:2)

您无法执行此操作,因为您必须返回键入为object的匿名对象(即System.Object)。

选项:

  • 设计一个班级。
  • 返回Dictionary<TKey, TValue>(如果您想根据某些特定条件返回未知数量的参数,最佳选择)。例如:`new Dictionary {{&#34; a&#34;,1},{&#34; b&#34;,2}};
  • 返回tuple。与Dictionary<TKey, TValue>建议相同,但由于元组项目为Item1ItemN,您已失去为每个返回值指定名称的机会。例如:Tuple.Create(1, 2);
  • 键入为动态(最差选项,不要使用dynamic以避免输入引用,因为C#是一种强类型语言)。

答案 3 :(得分:1)

您可以使用动态或反射

dynamic obj=GetValues();
var  a=obj.a;

object obj=GetValues();
var val_a=obj.GetType().GetProperty("a").GetValue(obj, null);