c# - 如何使用 Func<> 参数创建自定义属性

标签 c# custom-attributes

我有一个类可以帮助我将数据从 MS SQL 数据库读取到对象列表中。在大多数情况下,它非常简单;我可以假设类的属性名称与表的列名称匹配,并相应地分配它,但有时我需要能够转换数据。

我创建了一个自定义属性来放置我的类属性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TransformDataAttribute : Attribute
{
    public Func<object, string, object> TransformThisData { get; set; }
}

现在,假设我想动态创建 Func,如下所示:

    [TransformData(TransformThisData = new Func<object, string, object>((v, p) => "My name is " + v.ToString()))]
    public string Name { get; set; }

我看到的错误是“TransformThisData”不是有效的命名属性参数,因为它不是有效的属性参数类型。

将 Func 作为属性实现的最佳方法是什么?

最佳答案

嗯,这是我能想到的最好的。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class TransformDataAttribute : Attribute
{
    public string TransformDataClass { get; set; }
    // This method must contain these parameters: (object value, PropertyInfo pi)
    public string TransformDataMethod { get; set; }
}

我把它放在类属性上,就像这样......

  public class Tracker
  {
    [TransformData(TransformDataClass = "CompanyTracker.DataTransformation", TransformDataMethod = "FunkyData")]
    public string FunkyData { get; set; }
  }

我可以拥有一个具有不同转换方法的数据转换类:

public class DataTransformation
{
    public object FunkyData(object value, PropertyInfo pi)
    {
        // if data is this, return that, blah, blah
        return value;
    }
}

用于解释三个参数的静态实用方法:

    public static object CallThisMethod(string className, string methodName, object[] parms)
    {
        Type type = Type.GetType(className);
        MethodInfo theMethod = type.GetMethod(methodName);
        object classInstance = Activator.CreateInstance(type);

        return theMethod.Invoke(classInstance, parms);
    }

...然后在我的 ADO Helper 代码中,当涉及到为属性赋值时:

        TransformDataAttribute attr = Utility.GetPropertyAttribute<TransformDataAttribute>(pi);
        if (attr != null)
        {
            object[] parms = new object[] { value, pi };
            value = Utility.CallThisMethod(attr.TransformDataClass, attr.TransformDataMethod, parms);
        }
        pi.SetValue(t, value, null);

它有效。我讨厌依赖类和方法的嵌入字符串的反射,这似乎不是一个好的设计,但有时你只需要完成工作。如果有人有更优雅的方法来做到这一点,我很高兴听到它。

关于c# - 如何使用 Func<> 参数创建自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414826/

相关文章:

c# - 从基类访问应用于派生类中方法的属性

c# - 我可以在属性中添加属性吗?

c# - 如何将字符串转换为带尾随零的十进制

c# - 无法将带有 [] 的索引应用于类型的表达式

c# - 限制可以使用 C# 自定义属性的位置

android - Android 中的自定义属性

c# - 将属性限制为类或属性是否可行?

c# - 有关在.NET中调用分布式系统的批处理建议

c# - 防止任务在特定线程上运行

c# - 在 asp.net mvc Twitter OAuth2 登录后获取 oauth 凭据