如何访问类型的“静态”实例成员?

时间:2019-02-20 08:15:05

标签: c# compile-time

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

考虑:

interface IFoo
{
  int X { get; }
}

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

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

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

2 个答案:

答案 0 :(得分:8)

否,没有C#运算符以这种编译时类型安全的方式引用成员。这是feature that is frequently requested, but really difficult to design well。 C#6中引入的nameof运算符可以解决大多数设计问题,同时满足大多数 用例。

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

如果出于“安全性”的考虑,“编译时”部分对您很重要,而不是为了在编译时实际评估名称,则可以使用多种方法。例如:

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

这比在执行时必须找到更好,但是在执行时仍要请求类型名称。

答案 1 :(得分:3)

简短的回答:您不能在编译时执行此操作。不过,您可以在运行时中使用反射来做到这一点。

不过,有一些方法可以帮助您至少使用nameof来获得名字:

nameof(IFoo.Name)

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

以下功能从未达到语言功能,尽管有一些要求:

typeof(IFoo.Name)

甚至是埃里克·利伯特(Eric Lipert)提到的infoof运算符(请参阅乔恩斯答案)。

相关问题