Сильно типизированный элемент атрибута C # для описания свойства

1

Мне было интересно, можно ли объявить свойство 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; }
}

EDIT: Чтобы избежать использования строк имен свойств, я построил простой инструмент, позволяющий сохранять проверки времени компиляции во время хранения и использования имен свойств в местах в виде строк.

Идея заключается в том, что вы быстро ссылаетесь на свойство через его тип и имя с помощью справки 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;
    }
 }
Теги:
custom-attributes

1 ответ

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; }
}
  • 1
    Хорошо, спасибо. Не тот ответ, который я надеялся увидеть. Нет строгой типизации членов в качестве параметров :-(
  • 0
    Я отмечу как ответ, пока кто-то не докажет, что вы не правы ;-) через 7 минут

Ещё вопросы

Сообщество Overcoder
Наверх
Меню