-1

我有以下课程

public abstract class Result<TResult, TData> where TResult : Result<TResult, TData>
{
    public virtual TData Data { get; private set; }
}

如何在 Data 属性上使用 nameof?

它尝试了一些选项,但出现编译错误

nameof(Result<object, object>.Data)

Error   CS0311  
The type 'object' cannot be used as type parameter 'TResult' in the generic type or method 
'Result<TResult, TData>'. There is no implicit reference conversion from 'object' to 
'Result<object, object>'

更新 为了更好地指定:

我没有在第一个片段中编写类,但我必须按原样使用它。我需要使用反射来获取 Data 属性的 PropertyInfo 实例。我可以通过调用 GetProperty("Data") 来做到这一点,但我更喜欢避免使用字符串,以防使用 Visual Studio 重构重命名 name 属性(例如从数据到内容)。我不能使用 nameof(Data) 并且我处于不同的上下文中,不知道该类中的 Data 属性。

因此,我会调用 GetProperty(nameof({whatever}.Data))。当然,如果不可能,我会使用字符串。但如果有办法,我想知道。

4

1 回答 1

2

不幸的是,nameof运算符不适用于未绑定的泛型类型。例如,你希望能够写作nameof(Result<,>.Data),就像你今天能写出类似的东西typeof(Result<,>)nameof(Result<TResult, TData>.Data)因此,您在尝试获取值时需要指定类型参数。

您已经尝试过,但是您提供object了两个参数的类型参数,即使您的泛型类型约束TResult为从Result<TResult, TData>. 该类型object不符合约束,因此不可能工作。因此编译器错误。

显然,如果您可以提供任何满足约束的类型,那将解决编译器错误并允许您使用nameof运算符。您的问题中没有足够的信息来了解这是否是您特定情况下的一个选项。

我同意这个评论,你可能最好问一个不同的问题,一个退后一步,解释你是如何感觉到你首先需要这种语法的。目前尚不清楚您要实现的更广泛的目标是什么,您不知道用于此表达式的类型参数。通常,想要使用泛型类型的泛型类型之外的代码实际上会知道它打算与泛型类型一起使用的类型参数。

请注意,在泛型类型本身的上下文中,您可以在不知道确切类型参数的情况下引用属性,因为属性标识符不需要限定。例如nameof(Data),对于实际上在泛型类中的任何代码都可以Result<TResult, TData>。从目前提供的信息来看,这是否有助于您的具体情况尚不清楚。

于 2020-09-18T02:56:22.520 回答