我有课:
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 );
In case of curios why I needed that functionality click here
答案 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!!!