获取 属性-通用摘要的名称 class

Get property-name of generic abstract class

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

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

有没有机会获得 属性 Request 的名称而不继承它的实例?

我需要 Request 作为字符串 "Request" 以避免使用硬编码字符串。有什么想法可以通过反思来实现吗?

从 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);

您能否详细说明您要实现的目标?看起来您正在向网络 API 发出请求,您想要 属性 的名称用于什么目的以及在什么情况下?

这将为您提供对象类型中所有属性的名称:

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