So rufen Sie die statische Schnittstellenmethode über Reflektion auf

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: So rufen Sie die statische Schnittstellenmethode über Reflektion auf

by Guest » 16 Jan 2025, 10:33

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.

Top