So rufen Sie die statische Schnittstellenmethode über Reflektion aufC#

Ein Treffpunkt für C#-Programmierer
Guest
 So rufen Sie die statische Schnittstellenmethode über Reflektion auf

Post 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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post