【问题标题】:Access fields wrapped inside anonymous type or Object class访问封装在匿名类型或对象类中的字段
【发布时间】:2015-12-16 19:15:54
【问题描述】:

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

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

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

【问题讨论】:

  • 我重新打开了问答环节。另一个问答不是关于如何处理从方法返回的匿名对象........

标签: c# c#-4.0


【解决方案1】:

两种选择:

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

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

或者,如果您可以可能将方法更改为不使用匿名类型,请这样做。 (您可能无法根据上下文更改方法的签名,但即便如此,您仍然可以在调用代码中进行强制转换。)

【讨论】:

  • @PatrickHofman:嗯,这是一个更大的选择,是的。将编辑。
【解决方案2】:

如果将其分配给dynamic,则可以获取属性(继续阅读,不要使用此代码):

dynamic d = YourMethodReturningAnonymousType();

var a = d.a;

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

【讨论】:

  • 你只比我早几秒钟,所以这不算数。另外,我提供了一些可以使用的东西。在我看来,乔恩错过了一个关键步骤,所以这对我来说很重要。不太清楚你为什么这么关心这个......
  • 谁知道,我只是给你一个意见
【解决方案3】:

您不能这样做,因为您必须返回键入为 object 的匿名对象(即 System.Object)。

选项:

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

【讨论】:

    【解决方案4】:

    你可以使用动态或反射

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多