我需要转换许多不同的对象,并且我想避免为每个对象编写一个转换器类。每个对象都从基类继承,我需要使用Id来获取Description(在我对CacheManager的调用中处理)。

对于每个班级(我大约有30个班级),我编写了以下代码:

object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    Dictionary<int, string> codes = CacheManager.CodeLookup<CourtEventCode>();
    int id = 0;
    string result = string.Empty;

    if (int.TryParse(value.ToString(), out id) && id > 0)
    {
        if (codes.ContainsKey(id))
        {
            result = codes[id];
        }
        else
        {
            result = "Unknown";
        }
    }

    return result;
}


在上面的示例中,CourtEventCode代表这一类的转换器。有什么办法可以从IValueConverter的targetType输入派生该类,而不是本质上必须将该类复制并粘贴两次。

提前致谢,
桑尼

最佳答案

是的,您可以使用反射调用CacheManager.CodeLookup。

根据您共享的代码,将如下所示:

Type containingType = typeof (CacheManager);
var method = containingType.GetMethod("CodeLookup",
    BindingFlags.Static | BindingFlags.Public, null, new Type[0], new ParameterModifier[0]);
var concreteMethod = method.MakeGenericMethod(targetType);
Dictionary<string,int> codes = (Dictionary<string,int>)concreteMethod.Invoke(null, null);


如果您经常使用该方法,则可能需要为每个targetType缓存concreteMethod实例,在性能方面,反射可能会付出高昂的代价。

编辑:方法重载时,为了匹配特定的重载;使用允许您指定确切参数的GetMethod重载,在空数组中传递(因为要调用的重载没有参数)。代码示例已更新。

10-04 19:09