包装在匿名类型或Object类中的访问字段
本文关键字:访问 字段 Object 类型 包装 | 更新日期: 2023-09-27 18:26:56
我有一个返回如下的方法,
return new { a, b, c, d};
方法定义为public object GetValues();
调用此方法后,如何访问这些变量a、b、c、d?
两个选项:
-
使用动态打字,只要你是从同一个程序集使用它:
dynamic values = GetValues(); var a = values.a; //etc
-
直接使用反射;生成的类型将具有称为
a
、b
、c
和d
的公共只读属性
或者,如果您可以可能将方法更改为不使用匿名类型,请执行此操作。(您可能无法根据上下文更改方法的签名,但即使这样,您仍然可以强制转换调用代码。)
如果将其分配给dynamic
,则可以获取属性(请继续阅读,不要使用此代码):
dynamic d = YourMethodReturningAnonymousType();
var a = d.a;
请注意,您正在失去类型安全性,这是像C#这样的类型安全语言的关键方面之一。我的建议是:永远不要跨越方法的边界使用匿名类型。创建一个类并将其传递出去。
您不能这样做,因为您必须返回类型为object
(即System.Object
)的匿名对象。
选项:
- 设计一个类
- 返回一个
Dictionary<TKey, TValue>
(如果您想根据某些给定条件返回未知数量的参数,则为最佳选择)。例如:`new Dictionary{{"a",1},{"b",2}} - 返回元组。与
Dictionary<TKey, TValue>
建议相同,但您已经失去了为每个返回值命名的机会,因为元组项是Item1
、ItemN
。例如: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);