我需要转换许多不同的对象,并且我想避免为每个对象编写一个转换器类。每个对象都从基类继承,我需要使用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重载,在空数组中传递(因为要调用的重载没有参数)。代码示例已更新。