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

本文关键字:方法 引用 参数 属性 | 更新日期: 2023-09-27 18:25:45

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

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属性,甚至不知道它们是否序列化得很好

哪种方法最好?还有其他方法吗?人们通常是怎么做这些事情的?

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

第一个选项非常正常,并且具有简单的优点。你们说它有点容易重构是对的,但是。。。这很少是一个"真正的"问题。

然而,另一种(第四种)方法是用抽象方法使属性抽象,并用属性中的转换代码对其进行子类化——然后在运行时,您可以获得属性(作为基本属性)并只调用虚拟方法,这种方法在MVC等中很常见。

就我个人而言,我通常只使用第一个选项,以及用于安全性的单元测试(在重构等情况下)。