我需要转换许多不同的对象,并且我希望避免为每个对象编写一个转换器类。每个对象都继承自一个基类,我需要使用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;
}在上面的示例中,CourtEventCode表示这一个类的转换器。有没有一种方法可以从IValueConverter.Convert的targetType输入中派生出这个类,而不是本质上复制和粘贴这个类24次?
提前谢谢你,
桑尼
发布于 2010-09-09 00:38:06
可以,您可以使用反射调用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重载,在空数组中传递(因为您要调用的重载没有参数)。代码示例已更新。
发布于 2010-09-09 01:08:42
这个答案是泛型的替代方案。
您可以使用代码生成器,通过一次性创建所有类来帮助提高速度。创建一个空的'TT‘文件(你不会在新项目列表中看到它,只需手动输入扩展名即可。)单击警告对话框上的确定,然后将其粘贴到其中。从那里开始,直到输出文件看起来正确为止。每次保存TT文件时,都会重新创建输出文件。
// The code in this CS file is auto-generated.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Data;
namespace WpfApplication
{
<#
string[] classes = new string[]
{"CourtEventCode", "SomeOtherCode", "WhatElseIsThere"};
foreach (string classname in classes)
{
#>
public class <#= classname #>ValueConverter : IValueConverter
{
object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Dictionary<int, string> codes = CacheManager.CodeLookup< <#= classname #> >();
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;
}
// Implement the rest of IValueConverter
}
<# } #>
}https://stackoverflow.com/questions/3669859
复制相似问题