我使用反射来调用静态的泛型方法(因为该类型仅在运行时已知)。这似乎对我有用,直到类型为字符串。我得到一个"对象未设置为对象的实例"以下代码中Type proptype = entity[property.Key].GetType();
上的例外情况。我相信这是因为当它获得类型时,字符串是空的。
foreach (KeyValuePair<string, FieldAttribute> property in EntityProperties)
{
Type gen = typeof(DBGeneric);
MethodInfo mi = gen.GetMethod("FromDBVal");
Type proptype = entity[property.Key].GetType();
MethodInfo mil = mi.MakeGenericMethod(proptype);
object[] args = { dr[property.Value.ColumnName] };
entity[property.Key]=mil.Invoke(null, args);
}
dr
是一个datareader。 EntityProperties
是使用早期反射填充的字典,以避免不必要的重复反射。 FieldAttribute
是模型的每个属性的自定义属性,用于指定该属性如何与数据库中表的列相关联。以下是两个示例属性:
[Field("COLUMN1", "Description of this column.", true)]
public int Property1 { get; set; }
[Field("COLUMN2", "Description of this column.", true)]
public string Property2 { get; set; }
我调用的通用方法FromDBVal<T>
,大多只是处理数据库中的空值,但也处理一些类型有点不同(由于数据库设计,有时某些值将返回为decimal
精度为.00,应为int32
。
所以任何人都可以看到一种方法,我可以得到一个空字符串的类型吗?
编辑:
我已经尝试了其他答案提出的建议,但这对我不起作用。我结束了轻微的重构,单独处理字符串(也使用了Jon Skeet在https://stackoverflow.com/a/3561320/4852638的答案中的一些材料)。