我有一个类可以帮助我将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作为属性属性的最佳方法是什么?
答案 0 :(得分:2)
嗯,这是我能想到的最好的。
[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);
有效。我讨厌依赖于类和方法的嵌入字符串的反射,它似乎不是好的设计,但有时你只需要完成工作。如果有人有更优雅的方式来做到这一点,我很高兴听到它。