加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 23:50:49 所属栏目:百科 来源:网络整理
导读:我想访问“静态”(即在编译时)给定类型的实例成员(当然要检索它们的静态属性,而不是实际值或类似的东西). 考虑: interface IFoo{ int X { get; }} 我想直接访问X以检索编译时已知的内容,例如: Console.WriteLine(typeof(IFoo::X).Name); 反射是运行时,我问
我想访问“静态”(即在编译时)给定类型的实例成员(当然要检索它们的静态属性,而不是实际值或类似的东西).

考虑:

interface IFoo
{
  int X { get; }
}

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

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

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

解决方法

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

即使所谓的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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读