繁体   English   中英

为什么反射找不到属性

[英]Why reflection does not find property

我上课了:

    class Person 
    {
        public string Name { get { return "Antonio"; } }
    }

和守则:

        IEnumerable<object> uncknownObject;

        uncknownObject = new ObservableCollection<Person>( );

        var observCol = uncknownObject.GetType( );

        var x = ( ( dynamic )observCol ).GenericTypeArguments[ 0 ];

        var y = observCol.GetProperty( "GenericTypeArguments" );

        var instance = ( Person )Activator.CreateInstance( x );

        Console.WriteLine( instance.Name ); // Print Antonio!!!

为什么y == null

注意图片:

在此输入图像描述

调试器显示属性GenericTypeArguments应该存在,代码显示opossite。 可以证明调试器是正确的,并且该属性存在,因为那时x怎么不是null。 如果该属性存在,那么为什么y等于null !!! ???


编辑

感谢Ani我现在有:

        IEnumerable<object> uncknownObject;

        uncknownObject = new ObservableCollection<Person>();

        var observCol = uncknownObject.GetType();

        var genTypeArgsProperty = typeof(Type).GetProperty("UnderlyingSystemType");

        var genTypeArgsValue = (genTypeArgsProperty.GetValue(observCol, null));

        var f = genTypeArgsValue.GetType().GetMethod("GetGenericArguments");

        IEnumerable<object> result = (IEnumerable<object>)f.Invoke(genTypeArgsValue, null);

        var x = result.FirstOrDefault();

        var instance = Activator.CreateInstance(  (Type)x );

如果是古玩,为什么我需要这个功能,请点击这里

我真的不明白你要用所有这些元元反射完成什么,但你似乎误解了Type.GetProperty作用。 它获取System.Type实例(在本例中为ObservableCollection<Person> )表示的实际类型上的属性的元数据。 不会对声明的属性获取元数据System.Type本身,当然,除非你把它叫做一个System.Type代表System.Type本身。

在您的情况下, y为null,因为ObservableCollection<Person>没有名为“GenericTypeArguments”的属性。

试试这个:

var genTypeArgsProperty = typeof(Type).GetProperty("GenericTypeArguments");

var genTypeArgsValue = (Type[]) (genTypeArgsProperty.GetValue(observCol, null));

var onlyTypeArgValue = genTypeArgsValue.Single();

此代码适用于net framework 4:

        IEnumerable<object> uncknownObject;

        uncknownObject = new ObservableCollection<Person>();



        var observCol = uncknownObject.GetType();

        var x = ((dynamic) observCol).UnderlyingSystemType.GetGenericArguments()[0];

        var y = observCol.GetGenericArguments();

        var instance = (Person)Activator.CreateInstance(x);

        Console.WriteLine(instance.Name); // Print Antonio!!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM