如何访问新的{int a,string b}中的对象

Mar*_*aev 4 .net c# oop visual-studio-2013

我有一个方法

public Action FirstAction(object data)
{
}
Run Code Online (Sandbox Code Playgroud)

我必须将两个变量传递给此类,例如int,它们是不同类型string的对象或任何其他类型的对象.

我读过我能做到的

FirstAction( new{int a, string b} )
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在FirstAction方法中访问两个分离的变量?

注意:我无法将object参数更改为object[]params object[]; 它需要使用当前签名完成.

Asi*_*sik 9

如果您无法更改功能签名,则可以始终使用动态:

public Action FirstAction(object data) { 
     dynamic dataAsDynamic = data;
     int a = dataAsDynamic.a;
     string b = dataAsDynamic.b;
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是非常脆弱的,因为有人会更改代码将中断的这些字段的名称.我实际上并不建议这样做,但如果你无法控制功能签名那么你就有点卡住了.


ang*_*son 6

你需要使用反射:

foreach (var property in data.GetType().GetProperties())
{
    if (!property.CanRead) continue;
    if (property.GetIndexParameters().Length > 0) continue;
    string name = property.Name;
    object value = property.GetValue(data, null);

    ...
}
Run Code Online (Sandbox Code Playgroud)

或动态:

dynamic d = data;
int a = d.a;
string b = d.b;
...
Run Code Online (Sandbox Code Playgroud)