Как вызвать метод статического интерфейса через отражениеC#

Место общения программистов C#
Ответить
Anonymous
 Как вызвать метод статического интерфейса через отражение

Сообщение Anonymous »

Как реализовать функцию следующим образом?

Код: Выделить всё

static object GetZero(Type t)
{
// If t implements INumberBase, then return INumberBase.Zero
// Otherwise, throw some arbitrary Exception
}
Моя попытка на данный момент была:

Код: Выделить всё

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);
}
Однако в dotnet7 это не удается, за одним весьма неприятным исключением. Например, GetZero(typeof(int)) выдает

System.BadImageFormatException : Bad IL-формат.
в System.Reflection.MethodInvoker.Invoke( Object obj, IntPtr* args, BindingFlags ignoreAttr)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags вызоваAttr, связыватель Binder, параметры Object[], культура CultureInfo)
at System.Reflection.PropertyInfo.GetValue(Object obj)

Почему эта реализация выдает ошибку?
Есть ли другой способ реализовать это через отражение?

Изменить:
Я могу обойдите эту проблему, добавив статический метод следующим образом:

Код: Выделить всё

 static T Zero() where T : INumberBase
{
return T.Zero;
}
Тогда мой код отражения вызывает это вместо свойства интерфейса. Это работает, но кажется… некрасивым? Так что мне все еще любопытно, почему исходный код выше выдает ошибку.

Подробнее здесь: https://stackoverflow.com/questions/760 ... reflection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»