Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中定义基于命名空间的模板类或函数?_C#_Generics - Fatal编程技术网

如何在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

在C#中,我是否可以定义这样的类,
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");
}