如何访问类型的 "statically" 个实例成员?

How to access "statically" instance members of types?

我想访问 "statically"(即在编译时)给定类型的实例成员(当然是检索它们的静态属性,而不是实际值或类似的东西)。

考虑:

interface IFoo
{
  int X { get; }
}

我想直接访问 X 以检索编译时已知的内容,例如:

Console.WriteLine(typeof(IFoo::X).Name);

反射是运行时,我问的是编译时

简短回答:您不能在编译时执行此操作。不过,您可以使用反射在 运行时 完成。

然而,使用 nameof:

至少可以帮助您获得名称
nameof(IFoo.Name)

不过,这不会为您提供该成员的编译时类型。

以下功能从未成为语言功能,尽管存在一些请求:

typeof(IFoo.Name)

甚至 Eric Lipert 提到的 infoof-运算符(参见 Jons 的回答)。

不,没有像这样以编译时类型安全的方式引用成员的 C# 运算符。这是一个feature that is frequently requested, but really difficult to design well。 C# 6 中引入的 nameof 运算符设法绕过大部分设计问题,同时满足 大多数 用例。

即使假定的 infoof 运算符 did 存在,也不太可能有方法从中访问特定属性(例如 return 编译时 属性) 的类型。

如果 "compile-time" 部分是为了 安全 而不是为了在编译时实际评估名称,那么有一些方法可以工作。例如:

public static class TypeHelpers<TInput>
{
    public static Type GetReturnType<TOutput>(Func<TInput, TOutput> func) =>
        typeof(TOutput);
}

然后:

Type returnType = TypeHelpers<IFoo>.GetReturnType(foo => foo.X);
Console.WriteLine(returnType.FullName); // System.Int32

这比必须在执行时 查找 成员要好,但它仍然在执行时请求类型名称。