簡體   English   中英

如何使用Func <>參數創建自定義屬性

[英]How to create custom attribute with Func<> parameter

我有一個可以幫助我從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; }
}

我把它放在class屬性上,就像這樣...

  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);

有用。 我討厭依賴於嵌入式字符串的反射來實現類和方法,但這似乎並不是一個好的設計,但是有時候您只需要把事情做好即可。 如果有人能以更優雅的方式做到這一點,我將很高興聽到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM