首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用IValueConverter?

通用IValueConverter?
EN

Stack Overflow用户
提问于 2010-09-09 00:27:28
回答 2查看 2.4K关注 0票数 5

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

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

代码语言:javascript
复制
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次?

提前谢谢你,

桑尼

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-09 00:38:06

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

根据您所分享的代码,它将是这样的:

代码语言:javascript
复制
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重载,在空数组中传递(因为您要调用的重载没有参数)。代码示例已更新。

票数 1
EN

Stack Overflow用户

发布于 2010-09-09 01:08:42

这个答案是泛型的替代方案。

您可以使用代码生成器,通过一次性创建所有类来帮助提高速度。创建一个空的'TT‘文件(你不会在新项目列表中看到它,只需手动输入扩展名即可。)单击警告对话框上的确定,然后将其粘贴到其中。从那里开始,直到输出文件看起来正确为止。每次保存TT文件时,都会重新创建输出文件。

代码语言:javascript
复制
// 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
    }

<# } #>
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3669859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档