gpt4 book ai didi

C# - 将泛型接口(interface)转换为传递在运行时确定的类型 的泛型类

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:51 28 4
gpt4 key购买 nike

如何通过传递在运行时确定的类型来转换具有通用接口(interface)的通用类?

public class SomeDataChanged
{
public string EventName { get; set; }
}

public class MessageSub<T> where T : class
{
public IMessageBus Bus { get; set; }
public ISubscription<T> Sub { get; set; }
}

public interface IDataChangedService<T> where T : class
{
MessageSub<T> ProcessData(string topic, string subscription);
}

public class DataChangedService<T> : IDisposable, IDataChangedService<T> where T : class
{
public MessageSub<T> ProcessData(string topic, string subscription)
{
// Some code
}

// More code
}

我使用反射将运行时确定的类型传递给使用以下 thread 的泛型类.但不知道如何将其转换为另一种通用类型。

class Test
{
static void Main()
{
string topic = "OrderChanged";
string subscription = "MyUi";
string typeName = "OrderDataChanged";
Type T = Type.GetType(typeName);

Type genericClass = typeof(DataChangedService<>);
Type constructedClass = genericClass.MakeGenericType(T);

//How to cast another generic interface to my constructed class?
var obj = (IDataChangedService<T>)Activator.CreateInstance(constructedClass);

//Also how to return generic type object?
MessageSub<T> msgSub = obj.ProcessData(topic, subscription);

// and, then some code that use msgSub
}
}

最佳答案

你不能做 IDataChangedService<T> . TSystem.Type 类型的运行时变量, 而不是由字符串 typeName 表示的编译时类型.要使用泛型参数,类型必须是编译时的。

您需要引入一些非泛型类型才能使其正常工作。

像这样:

public interface IMessageSub { }

public class MessageSub<T> : IMessageSub where T : class
{
public IMessageBus Bus { get; set; }
public ISubscription<T> Sub { get; set; }
}

public interface IDataChangedService
{
IMessageSub ProcessData(string topic, string subscription);
}

public interface IDataChangedService<T> : IDataChangedService where T : class
{
MessageSub<T> ProcessData(string topic, string subscription);
}

public class DataChangedService<T> : IDataChangedService<T> where T : class
{
IMessageSub IDataChangedService.ProcessData(string topic, string subscription)
{
return this.ProcessData(topic, subscription);
}

public MessageSub<T> ProcessData(string topic, string subscription)
{
// Some code
}

// More code
}

然后你可以这样做:

var obj = (IDataChangedService)Activator.CreateInstance(constructedClass);

obj.ProcessData(topic, subscription);

关于C# - 将泛型接口(interface)转换为传递在运行时确定的类型 <T> 的泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35497232/

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