3

我有课:

    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应该存在并且代码显示相反。可以证明调试器是正确的并且该属性存在,因为那么 x 怎么不为空。如果该属性存在,那么为什么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 );

如果有古玩,为什么我需要该功能,请单击此处

4

2 回答 2

4

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

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

试试这个:

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

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

var onlyTypeArgValue = genTypeArgsValue.Single();
于 2013-02-01T05:10:55.313 回答
3

此代码适用于网络框架 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!!!
于 2013-02-01T05:15:10.073 回答