So rufen Sie die statische Schnittstellenmethode über Reflektion auf
Posted: 16 Jan 2025, 10:33
Wie können Sie eine Funktion wie folgt implementieren?
Mein bisheriger Versuch war:
Unter dotnet7 schlägt dies jedoch mit einer ziemlich unangenehmen Ausnahme fehl. Beispielsweise löst GetZero(typeof(int))
System.BadImageFormatException : Bad IL format.
bei System.Reflection.MethodInvoker.Invoke( Object obj, IntPtr* args, BindingFlags invokeAttr)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[]-Parameter, CultureInfo-Kultur)
at System.Reflection.PropertyInfo.GetValue(Object obj)
Warum ist das so? Diese Implementierung wird ausgelöst?
Gibt es eine andere Möglichkeit, dies über Reflektion zu implementieren?
Bearbeiten:
Ich kann dies umgehen, indem ich Folgendes hinzufüge eine statische Methode als folgt
Dann ruft mein Reflexionscode dies anstelle der Schnittstelleneigenschaft auf. Das funktioniert, scheint aber ... hässlich? Ich bin also immer noch neugierig, warum der ursprüngliche Code oben auslöst.
Code: Select all
static object GetZero(Type t)
{
// If t implements INumberBase, then return INumberBase.Zero
// Otherwise, throw some arbitrary Exception
}
Code: Select all
static object GetZero(Type t)
{
return t
.GetInterfaces()
.Single(x => x.IsGenericType && !x.IsGenericTypeDefinition && x.GetGenericTypeDefinition() == typeof(INumberBase))
.GetProperty("Zero", BindingFlags.Public | BindingFlags.Static)
.GetValue(null);
}
System.BadImageFormatException : Bad IL format.
bei System.Reflection.MethodInvoker.Invoke( Object obj, IntPtr* args, BindingFlags invokeAttr)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[]-Parameter, CultureInfo-Kultur)
at System.Reflection.PropertyInfo.GetValue(Object obj)
Warum ist das so? Diese Implementierung wird ausgelöst?
Gibt es eine andere Möglichkeit, dies über Reflektion zu implementieren?
Bearbeiten:
Ich kann dies umgehen, indem ich Folgendes hinzufüge eine statische Methode als folgt
Code: Select all
static T Zero() where T : INumberBase
{
return T.Zero;
}