如何在c#中定义基于命名空间的模板类或函数?
在C#中,我是否可以定义这样的类,如何在c#中定义基于命名空间的模板类或函数?,c#,generics,C#,Generics,在C#中,我是否可以定义这样的类,T在这里是名称空间名称,而不是数据类型名称 public class MyClass<T> { T.DataType_Defined_in_T t; ........... } 及 使用名称空间无法做到这一点,但您可以实现一个类,该类充当名称空间中类型的访问器或工厂 interface IFactory { Type GetType1(); } namespace X { public class Typ
T
在这里是名称空间名称,而不是数据类型名称
public class MyClass<T>
{
T.DataType_Defined_in_T t;
...........
}
及
使用名称空间无法做到这一点,但您可以实现一个类,该类充当名称空间中类型的访问器或工厂
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());
}
请注意,如果包含命名空间的程序集尚未加载到appdomain中,则此反射解决方案将不起作用。谢谢,Michael。但在我的例子中,我已经写了一个类,里面有很多函数,很多数据类型都来自我正在使用的引用dll,但是突然出现了另一个我需要使用的模块,它有几乎相同的数据类型。我不想重写那些代码,我想分享我写的代码。听起来更像是一个“现在”。与其询问此解决方案是否存在,不如说明您当前拥有的(带有代码),并询问如何在不同程序集之间使用它。@Gisway:您的选项有限。要么最终得到我上面提出的OO解决方案,要么最终得到反射解决方案。您更喜欢反射吗?我更喜欢反射。考虑到您最初的问题,类型安全似乎是一个问题,但如果您对反射(在编译时不是类型安全的)满意,我将更新我的答案。如何
MyClass
还不知道其本身的类型?或者您是说要创建一个类型,而该类型位于另一个类中?我不认为这样做有什么好处,如果你已经知道t是什么,那么为什么还有另一个类是依赖项呢?我有两个可以使用的引用,它们的数据类型几乎相同,听起来很奇怪?但这是真的。我希望我的类可以为两个引用的DLL工作。几乎没有意义。但是您可以创建两个具有相同名称空间的类库,并且对于每个项目引用正确的库,那么您的MyClass将使用项目有引用的库。如果你愿意,这会容易得多。
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");
}