如何在属性参数中进行方法引用

时间:2012-02-26 05:15:02

标签: c# .net reflection

我想创建一个允许我指定应用于属性的方法的属性,如下所示:

public class MyClass
{
    [MyAttribute(Converter="ConverterMethod")]
    public string Prop { get; set; }

    public static string ConverterMethod(string src)
    {
        return src + " converted";
    }
}

这样做的“正确”方法是什么?

以下是我看到的方式:

  1. 创建字符串属性并在运行时使用反射提取相应的方法
  2. 生成Dictionary<string, Func<string, string>>并在运行时使用相应的方法填充它。然后使用属性的字符串属性作为键提取方法。这种方法更能抵抗重构,如果我重命名方法一切都会起作用(尽管字典键仍然保持不变)
  3. 制作'IConverter'界面并将typeof(ConverterImpl)传递给属性。然后在运行时创建转换器实例并使用其接口转换值。这种方式对我来说似乎是最好的,但我从未在属性中使用Type属性,甚至不知道它们是否序列化良好。
  4. 哪种方法最好?还有其他方法吗?人们通常如何做这些事情?

1 个答案:

答案 0 :(得分:2)

第一种选择很正常,并且具有简单的优点。你说它有点容易重构是对的,但是......这很少是一个“真正的”问题。

然而,另一种(第四种)方法是使用抽象方法使属性为abstract,并将其与属性中的转换代码一起子类化 - 然后在运行时,您可以获取属性(作为基本属性)和只需调用虚方法,这种方法在MVC等常见。

就个人而言,我通常只使用第一个选项,以及单元测试以确保安全(如果是重构等)。