如何使用反射从类中获取价值,c#

时间:2015-01-09 10:34:36

标签: c# .net winforms

我有两个班级

class FOO
{
    public string Id{get;set;}

    public Model Model{get;set}
}

class Model
{
    public string Id
}

我需要在扩展程序

中访问foo.Model.Id

在扩展方法中考虑T是我们为FOO

传递的类型

我可以访问T.GetType().GetProperty("Model").GetValue(instance, null);

但是如何访问Foo.Model.Id

2 个答案:

答案 0 :(得分:2)

您只需要为下一个对象重复原始语句:

public static int GetId<T>(this T obj)
{
    var model = obj.GetType().GetProperty("Model").GetValue(instance, null);
    return (int)(model.GetType().GetProperty("Id").GetValue(instance, null));
}

但是为什么你想把它放在一个通用的扩展方法中是值得商榷的。这是一个非常具体的产业链,所以没有多大意义。

更简单的方法是使用dynamic - 您根本不需要扩展方法:

dynamic d = obj;
int id = obj.Model.Id;

或者更好地使用界面:

public interface IFoo
{
    Model Model {get;set;}
}

public class Foo : IFoo 
{
    public string Id{get;set;}

    public Model Model{get;set}
}

public static int GetId(this IFoo obj)
{
    return obj.Model.Id;
}

答案 1 :(得分:1)

你必须第二次做同样的事情:

var model = instance.GetType().GetProperty("Model").GetValue(instance, null);
var id = model.GetType().GetProperty("Id").GetValue(model, null);