为什么反射找不到属性

时间:2013-02-01 04:56:47

标签: c# dynamic reflection

我有课:

    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

注意图片:

enter image description here

调试器显示属性 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 );

In case of curios why I needed that functionality click here

2 个答案:

答案 0 :(得分:4)

我真的不明白你要用所有这些元元反思来完成什么,但你似乎误解了Type.GetProperty的作用。它获取System.Type实例(在本例中为ObservableCollection<Person>)所代表的实际类型上的属性的元数据。它获取System.Type本身声明的属性的元数据,除非您在代表System.Type的{​​{1}}上调用它。

在您的情况下,System.Type为空,因为y没有名为“GenericTypeArguments”的属性。

请改为尝试:

ObservableCollection<Person>

答案 1 :(得分:3)

此代码适用于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!!!