使用开放定义从通用类的属性中获取值

5
有没有一种方法可以使用反射从开放类型中获取属性的值?
class Program
{
    static void Main(string[] args)
    {
        var target = new GenericType<string>();
        target.GetMe = "GetThis";
        target.DontCare = "Whatever";

        var prop = typeof(GenericType<>).GetProperty("GetMe");
        var doesntWork = prop.GetValue(target);
    }
}

public class GenericType<T>
{
    public string GetMe { get; set; }
    public T DontCare { get; set; }
}

prop.GetValue(target)会抛出以下异常:

无法在包含泛型参数的类型或方法上执行后期绑定操作。

我知道可以使用 target.GetType().GetProperty("GetMe").GetValue(target) 来获取值,但我想知道是否有一种方法可以在不知道类型的情况下获取值。

简单的解决方案是创建一个非泛型基类,其中只包含 GetMe,但我现在不能进行该更改。

3个回答

5

个人而言,我会避免使用反射,而是在这种情况下使用动态关键字。

var val = ((dynamic)target).GetMe;

但是,如果您真的想使用反射技术,以下内容可以起作用。

var val = typeof(GenericType<string>).GetProperty("GetMe").GetValue(target);

通用类型参数将根据上下文而异,因此第二个选项不起作用。 然而,“dynamic”选项正是我所需要的。 谢谢! - zimdanen

1
是的,问题在于您的typeof(GenericType<>)创建了一个代表不完整类型的Type对象。只有使用完整类型对象才能获取值。
您需要首先获取一个完整类型对象。由于您已经有一个要处理的对象,因此可以直接使用该对象的类型。
    var prop = target.GetType().GetProperty("GetMe");
    var doesWork = prop.GetValue(target);    

0
当您使用typeof(GenericType<>)时,您没有为类型提供T参数,因此运行时无法获取属性的值。 您需要在此处使用.GenericTypeArguments[0],就像这样:

var prop = typeof(GenericType<>).GenericTypeArguments[0].GetProperty("GetMe");

请参阅原始帖子以获取更多信息:

https://stackoverflow.com/a/12273584/213550


该链接讨论了从对象中获取类型而不是使用 typeof,但在这种情况下它不起作用。在获取开放类型时没有 GenericTypeArguments - zimdanen
只有在封闭/完全定义的类型上才能这样做。 typeof(GenericType <>)((GenericType <string>) myVar) .GetType()不是同一回事。 - zimdanen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接