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

本文关键字:访问 字段 Object 类型 包装 | 更新日期: 2023-09-27 18:26:56

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

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

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

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

两个选项:

  • 使用动态打字,只要你是从同一个程序集使用它:

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

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

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

dynamic d = YourMethodReturningAnonymousType();
var a = d.a;

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

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

选项:

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

您可以使用动态或反射

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

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