c# - 如何访问类型的“静态”实例成员?
问题描述
我想“静态地”访问(即在编译时)给定类型的实例成员(当然要检索它们的静态属性,而不是实际值或类似的东西)。
考虑:
interface IFoo
{
int X { get; }
}
我想X
直接访问以检索编译时已知的内容,例如:
Console.WriteLine(typeof(IFoo::X).Name);
反射是运行时,我问的是编译时。
解决方案
不,没有 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
这比必须在执行时找到成员要好,但它仍然在执行时请求类型名称。
推荐阅读
- c++ - 为什么我不断收到访问冲突异常?
- django - 如何在 Django-CKEditor 中上传 PDF?
- javascript - reactjs axios发布请求抛出错误
- javascript - 同步生成器的每个 `yield` 是否不可避免地分配一个新的 `{value, done}` 对象?
- json - 在 Flutter 的列表视图中创建一个动态的框数组?
- nouislider - 如何更改 noUislider 的刻度大小
- css - sass --watch / sass 术语无法识别
- javascript - 如何用 forEach 方法替换循环并合并条件语句?
- go - go build:/msfs2020-go-master 中没有 Go 文件
- lodash - _lodash 按 itemColor、itemSize、shopId 分组对象