我有一个通用扩展名:
public static T Get<T>(this DataRow row, string columnName)
{
if (row == null || string.IsNullOrWhiteSpace(columnName) || row.IsNull(columnName))
if (typeof(T) == typeof(string))
return (T)(object)string.Empty;
else
return default(T);
else
{
if (row[columnName].GetType() == typeof(T))
return row.Field<T>(columnName);
else
{
return (T)Convert.ChangeType(row[columnName], typeof(T));
}
}
}
我想将它与运行时已知类型一起使用:
obj = new K();
var props = obj.GetType().GetProperties();
for (int i = 0; i < props.Length; i++)
{
if (row.Table.Columns.Contains(props[i].Name))
{
// props[i].SetValue(obj, row[prop]);
props[i].SetValue(obj, row.Get<props[i].PropertyType>(props[i].Name));
}
}
但我明白:
编译器错误CS0019:运算符“operator”不能应用于类型“type”和“type”的操作数
当运行时类型已知时,如何调用泛型扩展?
我正在尝试这个解决方案:
但运气不佳 - 也许是因为我正在使用扩展?
我找到了解决方案:
var mi = typeof(Extensions).GetMethod("Get", [typeof(DataRow), typeof(string)]);
var generic = mi.MakeGenericMethod(props[i].PropertyType);
props[i].SetValue(obj, generic.Invoke(null, [row, props[i].Name ]));
Extensions 是静态类,我在其中声明了扩展 Get 方法。