我想知道是否可以声明一个描述属性的 Attribute 属性,因此需要如此强的类型,并且理想情况下,智能感知可以用来选择该属性。类类型通过将成员声明为类型类型很好地工作 但是如何将属性作为参数获取,以便“PropName”不被引用并且是强类型的?
到目前为止:属性类和示例用法看起来像
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class MyMeta : Attribute{
public Type SomeType { get; set; } // works they Way I like.
// but now some declaration for a property that triggers strong typing
// and ideally intellisense support,
public PropertyInfo Property { get; set; } //almost, no intellisence type.Prop "PropName" is required
public ? SomeProp {get;set;} // <<<<<<< any ideas of nice type to define a property
}
public class Example{
[MyMeta(SomeType = typeof(SomeOtherClass))] //is strongly typed and get intellisense support...
public string SomeClassProp { get; set; }
[MyMeta(SomeProp = Class.Member)] // <<< would be nice....any ideas ?
public string ClassProp2 { get; set; }
// instead of
[MyMeta(SomeProp = typeof(T).GetProperty("name" )] // ... not so nice
public string ClassProp3 { get; set; }
}
编辑: 为了避免使用属性名称字符串,我构建了一个简单的工具来保持编译时检查,同时将属性名称作为字符串存储和使用。
这个想法是,您可以通过它的类型和名称快速引用一个属性,并使用智能感知帮助和类似 resharper 的代码完成。然而将一个字符串传递给一个工具。
I use a resharper template with this code shell
string propname = Utilites.PropNameAsExpr( (SomeType p) => p.SomeProperty )
指的是
public class Utilities{
public static string PropNameAsExpr<TPoco, TProp>(Expression<Func<TPoco, TProp>> prop)
{
//var tname = typeof(TPoco);
var body = prop.Body as System.Linq.Expressions.MemberExpression;
return body == null ? null : body.Member.Name;
}
}