如何在c#中定义基于命名空间的模板类或函数
本文关键字:函数 命名空间 定义 | 更新日期: 2023-09-27 17:58:22
在C#中,我可以定义这样的类吗?这里T
是命名空间名称,而不是数据类型名称。
public class MyClass<T>
{
T.DataType_Defined_in_T t;
...........
}
或者在一个函数中:
public void MyFunction<T>(T.DataType_Defined_in_T t)
{
...............
}
有办法实现这个目标吗?
或者,某些东西可以在运行时切换引用:
介于:
using namespace np1;
和
using namespace np2;
使用名称空间无法做到这一点,但您可以实现一个类,作为名称空间中类型的访问器或工厂。
interface IFactory
{
Type GetType1();
}
namespace X
{
public class Type1 { }
public class Factory : IFactory
{
public Type GetType1() { return typeof(Type1); }
}
}
namespace Y
{
public class Type1 { }
public class Factory : IFactory
{
public Type GetType1() { return typeof(Type1); }
}
}
public void MyFunction<T>(T factory)
where T : IFactory
{
var type = factory.GetType1();
...
}
void Main()
{
MyFunction(new X.Factory());
MyFunction(new Y.Factory());
}
或者您可以实现一个非通用反射解决方案:
public void MyFunction(string ns)
{
var typesReader = from asm in AppDomain.CurrentDomain.GetAssemblies()
from type in asm.GetExportedTypes()
where type.Namespace == ns
select type;
var typeMap = typesReader.ToDictionary(t => t.Name);
var type1 = typeMap["Type1"];
...
}
void Main()
{
MyFunction("X");
MyFunction("Y");
}
请注意,如果尚未在appdomain中加载包含命名空间的程序集,则此反射解决方案将不起作用。