gpt4 book ai didi

c# - 当类型仅在运行时已知时如何调用具有限制的泛型

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:18 25 4
gpt4 key购买 nike

我想要一个类来处理下拉列表中的数据列表,它可以采用任何类型,因为我希望外部代码看起来像这样:

listProvider.For<AnEnumType>().And<AClass>.GetLists();

listProvider.ForEnum<AnEnumType>().ForClass<AClass>.GetLists();

这是示例代码

public class Foo
{
public void DoSomething<T>
{
if(typeof(T).IsEnum)
{
//Do Something
} else if (typeof(T).IsClass)
{
var bar = new Bar();

//Problem How to call bar as type T must be a reference type?
bar.GetData<T>()
}
}
}

public class Bar
{
public IProvideList<T> GetData() where T : class
{
//Do Something
}
}

public interface IProvideList<T> T : class
{

}

在编译时,编译器不知道 T 是一个类,但我知道它会在运行时。我可以用反射(reflection)来调用它:

bar.GetType().GetMethod("GetData").MakeGenericMethod(typeof(T));

但是,我无法在调用该方法时将结果转换回 (IProvideList),因为 T 必须是 referenceType

有什么办法可以解决这个问题吗?

最佳答案

而不仅仅是 Bar你可以使用 Bar<T>这一切自然而然地落在了:

public void DoSomething<T>
{
if(typeof(T).IsEnum)
{
//Do Something
}
else if (typeof(T).IsClass)
{
//Here you know T
var bar = new Bar<T>();
bar.GetData()
}
}

....
public class Bar<T>
{
public IProvideList<T> GetData<T>() where T : class
{
//Do Something
}
}

关于c# - 当类型仅在运行时已知时如何调用具有限制的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226629/

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