考虑以下通用抽象类的实现:
public abstract class BaseRequest<TGeneric> : BaseResponse where TRequest : IRequestFromResponse
{
public TGeneric Request { get; set; }
}
有没有机会获取属性Request
的名称而没有从中继承的实例?
我需要Request
作为字符串"Request"
以避免使用硬编码字符串。任何想法如何通过反思来实现这一点?
答案 0 :(得分:6)
从C#6开始,您应该可以使用nameof
运算符:
string propertyName = nameof(BaseRequest<ISomeInterface>.Request);
用于BaseRequest<T>
的泛型类型参数是无关紧要的(只要它符合类型约束),因为您没有从类型中实例化任何对象。
对于C#5及更早版本,您可以使用Cameron MacFarland's answer从lambda表达式中检索属性信息。下面给出了一个非常简化的适应(没有错误检查):
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);
答案 1 :(得分:1)
你能详细说明你想要实现的目标吗?看起来您正在向Web API发出请求,您想要了解该属性的名称以及在什么情况下?
这将为您提供对象类型中所有属性的名称:
var properties = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(p => p.Name);