如何通过只有一个类型而不使用反射来访问一个类型的实现的静态抽象接口成员?

Posted

技术标签:

【中文标题】如何通过只有一个类型而不使用反射来访问一个类型的实现的静态抽象接口成员?【英文标题】:How to access a type's implemented static abstract interface members by having only a type without using reflection? 【发布时间】:2021-09-11 10:57:54 【问题描述】:

如何通过只有一个类型并使用接口类型本身来访问一个类型实现的静态抽象接口成员?有什么办法吗? 我不是在谈论通过反射访问静态成员。

示例:

public interface ISomeInterface

   static int SomeProperty get; set;


public class SomeClass : ISomeInterface

   static abstract int SomeProperty get; set; = 2;


var implementingType = typeof(SomeClass);

ISomeInterface interface = /* How? */ 

有没有什么方法可以通过使用反射来访问这样的静态成员来获取值

void Method 
   var value = typeof(SomeClass).GetProperty("SomeProperty").GetValue(null);
   value = typeof(ISomeInterface).GetProperty("SomeProperty").GetValue(null);

强制转换是一个仅适用于实例的概念,因此不能用于类型定义。

【问题讨论】:

完全是猜测,但我想知道您是否可以从 SomeClass 获取接口映射(类似于 GetInterfaceMap,而不是在计算机上),解决实现您正在寻找的 API 的方法,并直接使用空目标调用该方法?请注意,与效率相差甚远。如果您不止一次这样做,您可能希望缓存已解析的方法,可能是在创建委托之后 这能回答你的问题吗? C# -- how does one access a class' static member, given an instance of that class? 遗憾的是没有。我明确地写道,这已经可以通过反射来完成。此外:由于强制转换是一个仅适用于对象实例的概念,因此不能在此处使用。 @SvenKrauter “否”是一个有效的答案。静态接口成员也是 C# 8,而不是 C# 10。 @GSerg 是的,答案是否定的。看我的回答。是的,你是对的,使用 c#8。我的意思是静态 abstract 成员,它们是 c#10。因此,我更正了有关此的标题和文字。 【参考方案1】:

在重新思考了这个问题和我想做什么之后,答案是否定的。

除了反射和通过使用访问静态prop之外,没有其他方法可以使用接口类型来访问实现类中静态抽象接口成员的覆盖值

GetProperty(name).GetValue(null)

编辑:SO 不是建议的地方,但我想到了类似的东西:

ISomeInterface a = (ISomeInterface)typeof(SomeImplementingClass);
var value = a.SomeInterface.SomeProperty;

var value = typeof(SomeImplementingClass).As<ISomeInterface>().SomeProperty;
var value = ISomeInterface.FromType<SomeImplementingClass>().SomeProperty;

...如果接口没有实现,'.As()' 会抛出异常。 不支持这两个示例。

【讨论】:

以上是关于如何通过只有一个类型而不使用反射来访问一个类型的实现的静态抽象接口成员?的主要内容,如果未能解决你的问题,请参考以下文章

说说对java反射的理解,使用反射如何获取一个类的所有方法,使用反射需要注意哪些问题?

Java面试题:如何通过反射获取和设置对象私有字段的值?

.Net C# 反射,了解只需3分钟

类型信息(RTTI和反射)——反射

反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性字段),而不去使用Invoke方法)

反射学习4-通过反射机制动态创建和访问数组