gpt4 book ai didi

c# - 调用接口(interface)方法,但 System.Reflection.MethodBase 设置为 System.Object

转载 作者:行者123 更新时间:2023-11-30 20:57:51 25 4
gpt4 key购买 nike

我试图在运行时调用一个通用接口(interface)方法,但是在查找类型信息时它似乎找到了 IDomainEventSubscriber 而不是传递的正确类型。

抛出运行时错误:对象与目标类型不匹配。

检查值我看到 handlerInstance 类型是 typeof(TestEventHandler)methodInfo{System.Reflection.MethodBase} 显示 {Void HandleEvent(System.Object )}.

因此它被设置为 System.Object 的方法类型而不是实际类型(例如,在我们调用 Dispatch(new TestEvent()); 的情况下为 TestEvent)

是否有可能获得正确的实现以便我可以在运行时调用接口(interface)成员?

public interface IDomainEventSubscriber<T>
{
void HandleEvent(T domainEvent);
}

class TestEventHandler : IDomainEventSubscriber<TestEvent>
{
public void HandleEvent(TestEvent domainEvent)
{
}
}

// some service that dispatches events
void Dispatch<T>(T eventToPublish) where T : class
{
Type handlerType = map.GetHandlersForType(eventToPublish.GetType());
// a valid object instance is returned from my IoC container
object handlerInstance = this.ResolveHandler<T>(handlerType);

// i can guarantee the instance implements IDomainEventSubscriber<T> where T
// is the same type as eventToPublish

Type typeInfo = typeof(IDomainEventSubscriber<T>);
MethodInfo methodInfo = typeInfo.GetMethod("HandleEvent");

// this line throws an error :(
methodInfo.Invoke(handlerInstance, new object[] { eventToPublish });
}

最佳答案

我认为您根本不需要反射(reflection)。鉴于您知道该实例实现了 IDomainEventSubscriber<T> , 为什么不把它转换成那个呢?

// You could make ResolveHandler just return IDomainEventSubscriber<T> of course
var handler = (IDomainEventSubscriber<T>) ResolveHandler<T>(handlerType);

handler.HandleEvent(eventToPublish);

但是你的代码实际上对我来说似乎工作正常,将它提取成一个简短但完整的程序(如下)。事实上,你的 methodInfo有一个 System.Object 类型的参数建议TSystem.Object不过,大概应该是 TestEvent .所以也许问题在于您的方法是如何被调用的?

using System;
using System.Reflection;

public class TestEvent{}

public interface IDomainEventSubscriber<T>
{
void HandleEvent(T domainEvent);
}

class TestEventHandler : IDomainEventSubscriber<TestEvent>
{
public void HandleEvent(TestEvent domainEvent)
{
Console.WriteLine("Done");
}
}

class Test
{
static void Main(string[] args)
{
Dispatch<TestEvent>(new TestEvent(), typeof(TestEventHandler));
}

static void Dispatch<T>(T eventToPublish, Type handlerType)
{
object handlerInstance = Activator.CreateInstance(handlerType);
Type typeInfo = typeof(IDomainEventSubscriber<T>);
MethodInfo methodInfo = typeInfo.GetMethod("HandleEvent");
methodInfo.Invoke(handlerInstance, new object[] { eventToPublish });
}
}

关于c# - 调用接口(interface)方法,但 System.Reflection.MethodBase 设置为 System.Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16498697/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com