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 输入派生该类,而不必基本上复制并粘贴该类两打?
预先感谢,
桑尼
是的,您可以使用反射调用 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 重载,它允许您指定确切的参数,传入一个空数组(因为您要调用的重载没有参数)。代码示例已更新。
| 归档时间: |
|
| 查看次数: |
2575 次 |
| 最近记录: |