我想访问"静态"(即在编译时)给定类型的实例成员(当然要检索它们的静态属性,而不是实际值或类似的东西).
考虑:
interface IFoo
{
int X { get; }
}
Run Code Online (Sandbox Code Playgroud)
我想X直接访问以检索编译时已知的内容,例如:
Console.WriteLine(typeof(IFoo::X).Name);
Run Code Online (Sandbox Code Playgroud)
反射是运行时,我问的是编译时.
不,没有C#运算符可以像这样以编译时类型安全的方式引用成员.这是一个经常被要求的功能,但很难设计好.nameof在C#6中引入的操作员可以绕过大多数设计问题,同时满足大多数用例.
即使假设的infoof运算符确实存在,也不太可能在编译时有一种方法从它访问特定的属性(例如属性的返回类型的名称).
如果"编译时"部分对于安全而言非常重要,而不是为了在编译时实际评估名称,那么有一些方法可行.例如:
public static class TypeHelpers<TInput>
{
public static Type GetReturnType<TOutput>(Func<TInput, TOutput> func) =>
typeof(TOutput);
}
Run Code Online (Sandbox Code Playgroud)
然后:
Type returnType = TypeHelpers<IFoo>.GetReturnType(foo => foo.X);
Console.WriteLine(returnType.FullName); // System.Int32
Run Code Online (Sandbox Code Playgroud)
这比在执行时找到成员要好,但它仍然在执行时请求类型名称.