获取 属性-通用摘要的名称 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);
考虑以下通用抽象的实现 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);