首页 > 解决方案 > 如何访问类型的“静态”实例成员?

问题描述

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

考虑:

interface IFoo
{
  int X { get; }
}

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

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

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

标签: c#compile-time

解决方案


不,没有 C# 运算符可以像这样以编译时类型安全的方式引用成员。这是一个经常被要求的功能,但很难设计好。C# 6 中引入的nameof运算符设法避开了大多数设计问题,同时满足了大多数用例。

即使假定的infoof运算符确实存在,也不太可能在编译时有办法从中访问特定属性(例如属性的返回类型的名称)。

如果为了安全而不是为了在编译时实际评估名称,“编译时”部分对您很重要,那么有一些方法可以工作。例如:

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

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


推荐阅读