Page 1 of 1

So rufen Sie die statische Schnittstellenmethode über Reflektion auf

Posted: 16 Jan 2025, 10:33
by Guest
Wie können Sie eine Funktion wie folgt implementieren?

Code: Select all

static object GetZero(Type t)
{
// If t implements INumberBase, then return INumberBase.Zero
// Otherwise, throw some arbitrary Exception
}
Mein bisheriger Versuch war:

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);
}
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

Code: Select all

 static T Zero() where T : INumberBase
{
return T.Zero;
}
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.