调用通用扩展方法,以运行时已知类型作为参数

问题描述 投票:0回答:1

我有一个通用扩展名:

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”的操作数

当运行时类型已知时,如何调用泛型扩展?

我正在尝试这个解决方案:

C# 中的泛型,使用变量类型作为参数

但运气不佳 - 也许是因为我正在使用扩展?

c# generics reflection
1个回答
0
投票

我找到了解决方案:

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 方法。

© www.soinside.com 2019 - 2024. All rights reserved.