Сильно типизированный элемент атрибута C# для описания свойства
Мне было интересно, можно ли было объявить свойство Attribute, описывающее свойство, так что требуется строгая типизация и в идеале, чтобы intellisense можно было использовать для выбора свойства. Типы классов хорошо работают, объявляя элемент типом типа. Но как получить свойство в качестве параметра, чтобы "PropName" не было заключено в кавычки и было строго типизировано?
Пока что: Класс Attibute и пример использования выглядит
[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; }
}
РЕДАКТИРОВАТЬ: Чтобы избежать использования строк с именами свойств, я создал простой инструмент для проверки времени компиляции при сохранении и использовании имен свойств в местах в виде строк.
Идея состоит в том, что вы быстро обращаетесь к свойству через его тип и имя с помощью intellisense и дополнением кода, например, из resharper. И все же перейдите в STRING к инструменту.
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;
}
}
1 ответ
Нет, это невозможно. Ты можешь использовать typeof
для имени типа, но должны использовать строку для имени члена. Это насколько вы можете получить:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class MyMeta : Attribute{
public Type SomeType { get; set; }
public string PropertyName {get;set;}
public PropertyInfo Property { get { return /* get the PropertyInfo with reflection */; } }
}
public class Example{
[MyMeta(SomeType = typeof(SomeOtherClass))] //is strongly typed and get intellisense support...
public string SomeClassProp { get; set; }
[MyMeta(SomeType = typeof(SomeOtherClass), PropertyName = "SomeOtherProperty")]
public string ClassProp2 { get; set; }
}