我有以下课程
public class RowDef
{
string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
public RowDef()
{
}
public RowDef(string name)
: this()
{
Name = name;
}
}
public class RowDef<T> : RowDef
{
public RowDef()
{
}
public RowDef(string name)
: base(name)
{
}
T _value;
public T Value
{
get { return _value; }
set { _value = value;}
}
}
我正在尝试使用反射来获取“Value”属性的值,如此
List<RowDef> rows = new List<RowDef>() { new RowDef<int>() { Value = 5 }, new RowDef<float>() { Value = 5.0f }, new RowDef<string>() { Value = "XXXX" } };
foreach (var row in rows)
{
var v = typeof(RowDef<>).InvokeMember("Value", BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.GetProperty, null, child, null);
}
但我得到以下异常
类型'System.InvalidOperationException'的第一次机会异常 发生在mscorlib.dll中附加信息:后期绑定操作 无法对其类型或方法执行 ContainsGenericParameters为true。
我该怎么做才能解决问题?
答案 0 :(得分:1)
由于错误试图告诉您,直接使用RowDef<>
没有意义。 RowDef<>
不是真正的类型;它是一个类型构造函数,可用于制作类似RowDef<string>
的具体类型。
在您的特定示例中,您实际上只需要row.GetType()
,它将返回该实例的具体RowDef<T>
类型。
或者,更好的是,根本不要使用Reflection,而是将abstract object UntypedValue
属性添加到基类并使用它。