WPF - 通用 IValueConverter?

Son*_*Boy 5 .net c# generics wpf converters

我需要转换许多不同的对象,并且我想避免为每个对象编写转换器类。每个对象都继承自一个基类,我需要使用 Id 来获取描述(这是在我对 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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,CourtEventCode代表这一类的转换器。有没有一种方法可以从 IValueConverter.Convert 的 targetType 输入派生该类,而不必基本上复制并粘贴该类两打?

预先感谢,
桑尼

dri*_*iis 1

是的,您可以使用反射调用 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);
Run Code Online (Sandbox Code Playgroud)

concreteMethod如果您经常使用该方法,也许您会希望缓存每个 targetType 的实例,反射在性能方面可能会代价高昂。

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