【发布时间】:2015-12-16 19:15:54
【问题描述】:
我有一个返回如下的方法,
return new { a, b, c, d};
方法定义为public object GetValues();
调用此方法后如何访问这些变量a、b、c、d?
【问题讨论】:
-
我重新打开了问答环节。另一个问答不是关于如何处理从方法返回的匿名对象........
我有一个返回如下的方法,
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);
【讨论】: