gpt4 book ai didi

c# - 调用继承自封闭泛型的方法信息

转载 作者:太空狗 更新时间:2023-10-30 01:17:19 25 4
gpt4 key购买 nike

 private static void Main(string[] args)
{
var messageType = typeof (SampleHandler1);
var genericType = typeof (IConsume<>).MakeGenericType(messageType);
var genericArguments = genericType.GetGenericArguments();
var consumeMethod = genericType.GetMethod("Consume");

var constructorInfo = genericArguments[0].GetConstructor(Type.EmptyTypes);
var classObject = constructorInfo.Invoke(new object[] {});

var argsx = new object[] {new SampleMessage {Name = "sample message"}};

consumeMethod.Invoke(classObject, argsx);
}

public interface IConsume<in T> where T : class
{
void Consume(T message);
}

public class SampleHandler1 : IConsume<SampleMessage>
{
public SampleHandler1()
{
Debugger.Break();
}

public void Consume(SampleMessage message)
{
Debugger.Break();
Console.WriteLine("Message consume: " + message.Name);
}
}


public interface IBaseMessage
{
}

public class SampleMessage : IBaseMessage
{
public string Name { get; set; }
}

我尝试查看此处,但找不到具体的解决方案。作为MSDN解释

obj Type: System.Object The object on which to invoke the method or constructor. If a method is static, this argument is ignored. If a constructor is static, this argument must be null or an instance of the class that defines the constructor.

classObject 是构造函数的一个实例,对吧?为什么抛出异常:enter image description here

最佳答案

这似乎不对。让我们分析一下这里发生了什么:

var messageType = typeof (SampleHandler1);
//simple enough, Type -> SampleHandler1

var genericType = typeof (IConsume<>).MakeGenericType(messageType);
//so genericType is a Type -> IConsume<SampleHandler1>

var genericArguments = genericType.GetGenericArguments();
//there's only one, but Type[] { Type -> SampleHandler1 }

var consumeMethod = genericType.GetMethod("Consume");
//MethodInfo -> IConsume<SampleHandler1>.Consume(SampleHandler1)

var constructorInfo = genericArguments[0].GetConstructor(Type.EmptyTypes);
//ConstructorInfo -> SampleHandler1..ctor()

var classObject = constructorInfo.Invoke(new object[] {});
//new SampleHandler1()

var argsx = new object[] {new SampleMessage {Name = "sample message"}};
//object[] { SampleMessage }

consumeMethod.Invoke(classObject, argsx);
//((IConsume<SampleHandler1>)classObject).Consume( SampleMessage ) -- oops?

所以 classObject是一个 SampleHandler1 ,但您正在尝试调用 IConsume<SampleHandler1>.Consume(SampleHandler1)更糟糕的是给它一个 SampleMessage作为论据。

我想你是想创建一个 SampleHandler1 , 并调用 IConsume<SampleMessage>.Consume(SampleMessage)在上面:

var messageType = typeof(SampleMessage);
var genericType = typeof(IConsume<>).MakeGenericType(messageType);
var consumeMethod = genericType.GetMethod("Consume");

var handlerType = typeof(SampleHandler1);
var constructorInfo = handlerType.GetConstructor(Type.EmptyTypes);
var classObject = constructorInfo.Invoke(new object[] {});

var argsx = new object[] {new SampleMessage {Name = "sample message"}};

consumeMethod.Invoke(classObject, argsx);

关于c# - 调用继承自封闭泛型的方法信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32133171/

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