[英]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.