鉴于我碰巧知道的一个对象是System.RuntimeType,我该如何获取一个输入的对象?

时间:2017-12-19 22:03:49

标签: c# reflection system.reflection

我做了一些可怕的DI反思:(

我已经获得了FieldInfo个对象,并在其上调用了GetValue()

我得到了object

在VisualStudio中检查此对象时,我发现它是"原型",而GetType()返回System.RuntimeType

在即时窗口中,我可以投射object as System.RuntimeType,然后我发现一个AsType()方法,它会返回我真实的类型对象。

不幸的是,当我尝试在我的代码中写这个时,我告诉System.RuntimeType是内部类型,因此我无法使用它:(。

如何从此对象中获取输入的对象?

<小时/> 完整代码:

KernelBase baseKernel = (KernelBase)ninjectKernel;
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
FieldInfo field = typeof(KernelBase).GetField("bindings", flags);

Multimap<Type, IBinding> allBindingsPerTypeMap = (Multimap<Type, IBinding>)field.GetValue(baseKernel);

var aBinding = allInterfaceTypesWithAllBindings.First(pair => pair.InterfaceType.Name.Contains("FilePath")).Binding;
var aBindingTarget = aBinding .BindingConfiguration.ProviderCallback.Target;

var prototype = aBindingTarget.GetType().GetField("prototype").GetValue(aBindingTarget);

// prototype is an object, which I'd like to turn into a real type.
var runtimeType = prototype.GetType(); // this returns System.RuntimeType

<小时/> 请注意,我真的不知道对象的类型是什么 - 我反思的东西,本身就是一个反思...我试图从我的提取中提取绑定信息DI框架。

根问题的解决方案很有用,但我确实想知道如何与此System.RuntimeType对象进行交互。

<小时/> 的 更新: Evk提出了一个&#34; moah反思!&#34;解决方案,确实有效。 (见评论)

如果有不反思的方法,我会热衷于知道吗?

1 个答案:

答案 0 :(得分:2)

我倾向于认为如果你在兔子洞(或者,我想,通过镜子)这么远的地方,你应该放弃从静态类型系统中受益的任何借口,并且只是利用动态运行时(假设您使用的是.NET 4或更高版本)。

请参阅https://blogs.msdn.microsoft.com/davidebb/2010/01/18/use-c-4-0-dynamic-to-drastically-simplify-your-private-reflection-code/,了解代码可以更整洁的示例(以及方便的“AsDynamic&#39;扩展方法”,以便更轻松)。