获取通用抽象类的属性名称

时间:2015-07-26 12:00:06

标签: c# generics reflection naming-conventions abstract-class

考虑以下通用抽象类的实现:

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

有没有机会获取属性Request的名称而没有从中继承的实例?

我需要Request作为字符串"Request"以避免使用硬编码字符串。任何想法如何通过反思来实现这一点?

2 个答案:

答案 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);