在不知道类型的情况下使用 nameof 访问泛型 class 的成员
Using nameof to access member of generic class without knowing the type
拿这两个类:
class NonGenericClass
{
public string Member { get; set; }
}
class GenericClass<T>
{
public string Member { get; set; }
}
我可以轻松做到这一点:
nameof(NonGenericClass.Member)
但是我做不到:
nameof(GenericClass.Member)
我能做到:
nameof(GenericClass<object>.Member)
但我不想。
有没有一种方法可以做我想做的事,而不必以我不想做的方式去做?
不,如果不指定类型参数,就无法对泛型类型(或该泛型类型的成员)使用 nameof
。我个人 喜欢 能够像使用 typeof
那样指定开放类型,即
// Would be nice, but isn't valid
string name = nameof(GenericClass<>.Member);
... 这将允许以相同的方式(GenericClass<,>
、GenericClass<,,>
等)区分具有不同参数的不同泛型类型,但这目前是无效的。已经有一个 feature request 对此有一些支持,但它肯定不会出现在 C# 7 中,如果它最多出现在 C# 8 之前,我会感到惊讶。
我建议您捏着鼻子使用 GenericClass<int>.Member
或类似的。任何造成这种破坏的变化都可能造成比这更糟糕的问题。如果您对所使用的类型参数保持一致,简单的搜索和替换应该可以修复它。
拿这两个类:
class NonGenericClass
{
public string Member { get; set; }
}
class GenericClass<T>
{
public string Member { get; set; }
}
我可以轻松做到这一点:
nameof(NonGenericClass.Member)
但是我做不到:
nameof(GenericClass.Member)
我能做到:
nameof(GenericClass<object>.Member)
但我不想。
有没有一种方法可以做我想做的事,而不必以我不想做的方式去做?
不,如果不指定类型参数,就无法对泛型类型(或该泛型类型的成员)使用 nameof
。我个人 喜欢 能够像使用 typeof
那样指定开放类型,即
// Would be nice, but isn't valid
string name = nameof(GenericClass<>.Member);
... 这将允许以相同的方式(GenericClass<,>
、GenericClass<,,>
等)区分具有不同参数的不同泛型类型,但这目前是无效的。已经有一个 feature request 对此有一些支持,但它肯定不会出现在 C# 7 中,如果它最多出现在 C# 8 之前,我会感到惊讶。
我建议您捏着鼻子使用 GenericClass<int>.Member
或类似的。任何造成这种破坏的变化都可能造成比这更糟糕的问题。如果您对所使用的类型参数保持一致,简单的搜索和替换应该可以修复它。