2017-12-19 7 views
1

Ich habe einige scheußliche DI Reflexion gemacht :(Gegeben ein Objekt, das ich kenne, ist ein System.RuntimeType wie bekomme ich ein getipptes Objekt heraus?

Ich habe ein FieldInfo Objekt bekommen und rief GetValue() darauf.

ich eine object zurück.

in Visual Studio dieses Objekt Untersuchen, ich entdecken, dass es ein „Prototyp“ ist, und dass GetType() kehrt System.RuntimeType.

In unmittelbarer Fenster kann ich meine object as System.RuntimeType gegossen und dann entdecke ich, eine AsType() Methode, w Das gibt mir mein echtes, getipptes Objekt zurück.

Leider, wenn versuchen, dies in meinem Code zu schreiben, mir gesagt, dass System.RuntimeType ein interner Typ ist, und somit kann ich es nicht verwenden :(.

Wie kann ich aus einem typisierten Objekt erhalten dieses Objekt


Voll Code:

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 


Bitte beachte, dass ich nicht weiß, eigentlich wirklich, was die Art des Objekts ist - das, was ich zu reflektieren, ist selbst ein Stück Re flection ... Ich versuche, verbindliche Informationen aus meinem DI-Framework zu extrahieren.

Lösungen für das Stammproblem sind nützlich, aber ich möchte wirklich wissen, wie man mit diesem System.RuntimeType Objekt interagiert.


UPDATE: Evk vorgeschlagen, eine "moah Reflexion!" Lösung, die tatsächlich funktioniert. (Siehe Kommentare)

Wenn es eine Nichtreflexion gibt, würde ich es gerne wissen?

+0

Sie verwenden Reflexion über ein anderes Stück Reflexion, und dann sagen Sie "Ich kann keinen Typ verwenden, weil es intern ist". Wenn nichts weiter hilft - können Sie die Reflexion noch einmal verwenden. – Evk

+0

D'oh! Offensichtlich! 'prototype.GetType(). GetMethod (" AsType "). Invoke (Prototyp, null)' funktioniert in der Tat. – Brondahl

+0

@Evk Wenn Sie den Kredit möchten, fühlen Sie sich frei, das als Antwort zu posten – Brondahl

Antwort

2

Ich neige dazu, zu denken, dass, wenn Sie so weit unten im Kaninchenloch (oder, ich denke, durch den Spiegel), sollten Sie jeden Vorwand aufgeben, von einem statischen System zu profitieren, und nur ausnutzen die dynamische Laufzeit (vorausgesetzt, Sie sind auf .NET 4 oder höher).

Siehe https://blogs.msdn.microsoft.com/davidebb/2010/01/18/use-c-4-0-dynamic-to-drastically-simplify-your-private-reflection-code/ für ein Beispiel, wie viel aufgeräumter der Code sein kann (und eine praktische "AsDynamic" -Erweiterungsmethode, um dies zu erleichtern).

Verwandte Themen