2015-07-26 4 views
3

Учитывая следующую реализацию общего, абстрактного класса:Получить свойства-имя общего абстрактного класса

public abstract class BaseRequest<TGeneric> : BaseResponse where TRequest : IRequestFromResponse 
{ 
    public TGeneric Request { get; set; } 
} 

Есть ли шанс, чтобы получить имя свойства Request без экземпляра унаследованного от него?

Мне нужно Request как строка "Request", чтобы избежать использования жестко закодированных строк. Любые идеи, как сделать это через отражение?

+1

«Мне нужен запрос как строка„Request“» Где вам это нужно? – weston

+0

Имеет ли тип type (BaseRequest <>). GetProperty («Запрос»). –

+0

@ xtnd8 nope, он содержит стробированную строку '' Request ''! – weston

ответ

6

Начиная с C# 6, вы должны быть в состоянии использовать nameof оператор:

string propertyName = nameof(BaseRequest<ISomeInterface>.Request); 

Параметр универсального типа используется для BaseRequest<T> не имеет никакого значения (до тех пор, как он встречается с ограничениями типа), так как вы не создание экземпляра любого объекта из этого типа.

Для C# 5 и старше вы можете использовать Cameron MacFarland's answer для получения информации о свойствах из лямбда-выражений. Сильно упростили адаптация приводится ниже (без проверки ошибок):

public static string GetPropertyName<TSource, TProperty>(
    Expression<Func<TSource, TProperty>> propertyLambda) 
{ 
    var member = (MemberExpression)propertyLambda.Body; 
    return member.Member.Name; 
} 

Вы можете потреблять его следующим образом:

string propertyName = GetPropertyName((BaseRequest<ISomeInterface> r) => r.Request); 
// or // 
string propertyName = GetPropertyName<BaseRequest<ISomeInterface>, ISomeInterface>(r => r.Request); 
+0

У меня есть общее ограничение, которое TGeneric должно наследовать ISomeInterface, поэтому объект здесь не разрешен. – KingKerosin

+0

@KingKerosin: В этом случае используйте 'BaseRequest ' вместо 'BaseRequest ', и приведенный выше код должен работать. Опять же, не имеет значения, что 'ISomeInterface' является интерфейсом или абстрактным. – Douglas

+0

Да. Это делает трюк. Спасибо – KingKerosin

1

Вы можете уточнить немного больше о том, что вы пытаясь достичь? Похоже, вы делаете запросы на веб-API, с какой целью вы хотите указать имя свойства и в каком контексте?

Это поможет вам имена всех свойств в типе объекта:

var properties = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(p => p.Name); 
+0

Я пытаюсь установить значение префикса 'BindAttribute' для имени свойства '' Request "' без использования жесткокодированной строки. См. Вопрос здесь: http://stackoverflow.com/questions/31616609/asp-net-mvc-4-property-renaming-for-posting – KingKerosin

Смежные вопросы