Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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中泛型的类型参数#_C#_Java_Generics - Fatal编程技术网

C# 限制C中泛型的类型参数#

C# 限制C中泛型的类型参数#,c#,java,generics,C#,Java,Generics,我可能会想象一些事情,但我似乎记得在Java中,我可以声明一个字段或参数: public class BarHandler{ public Class<? extends Foo> fooType; public ProcessedBar Process(string xml){ Foo foo = fooType.GetInstance(); return foo.process(xml) } } 公共类BarHandl

我可能会想象一些事情,但我似乎记得在Java中,我可以声明一个字段或参数:

public class BarHandler{

    public Class<? extends Foo> fooType;

    public ProcessedBar Process(string xml){
        Foo foo = fooType.GetInstance();
        return foo.process(xml)
    }
}
公共类BarHandler{
公共类是的,请参见。与您的示例相当的是:

public class SomeClass<T>
    where T : Foo
{
    private T fooType;
}
公共类SomeClass
T:Foo在哪里
{
私人T足型;
}
编辑后编辑:我相信您指的是,在这种情况下,您应该阅读有关泛型的内容。

公共类泛型类,其中T:Foo
public class GenericClass<T> where T : Foo

对于此注释,您可以使用非常简单的包装器和廉价的运行时检查:

public sealed class Type<T>
{
    public Type(Type type)
    {
        if (type == null)
            throw new ArgumentNullException("type");
        if (!typeof(T).IsAssignableFrom(type))
            throw new ArgumentException(string.Format("The specified type must be assignable to '{0}'.", typeof(T).FullName));

        this.Value = type;
    }

    public Type Value
    {
        get;
        private set;
    }
}

这是280Z28答案的变体。我已将“Type”类重命名为“Factory”,因为在我的版本中,它公开了一个
GetInstance
方法,而不是类型
type
Value
属性。这使用了2个泛型参数和泛型约束来强制执行类型类的原始答案构造函数中的规则

public abstract class Factory<T>
{
    public abstract T GetInstance();
}

public sealed class IoCFactory<T, TDerived> : Factory<T>
    where TDerived : T // compiler enforces that TDerived derives from T
{
    public override T GetInstance()
    {
        // TODO: retrieve instance of TDerived from IoC container such as Spring.NET, StructureMap, Unity, etc.
        throw new NotImplementedException();
    }
}

public sealed class ActivatorFactory<T, TDerived> : Factory<T>
    where TDerived : T, new() // compiler enforces that TDerived derives from T and that it has a parameterless constructor
{
    public override T GetInstance()
    {
        return Activator.CreateInstance<TDerived>();
    }
}

public class BarHandler
{
    public Factory<Foo> fooFactory { get; set; }

    public ProcessedBar Process(string xml)
    {
        Foo foo = fooFactory.GetInstance();
        return foo.Process(xml);
    }
}

class Program
{
    static void Main(string[] args)
    {
        BarHandler handler = new BarHandler();

        handler.fooFactory = new ActivatorFactory<Foo, Bar>();

        var processedResult = handler.Process("<bar>Yar!</bar>");
    }
}
公共抽象类工厂
{
公共抽象T GetInstance();
}
公共密封等级IOC工厂:工厂
其中TDerived:T//编译器强制执行TDerived派生自T
{
公共覆盖GetInstance()
{
//TODO:检索从IoC容器(如Spring.NET、StructureMap、Unity等)派生的TDE实例。
抛出新的NotImplementedException();
}
}
公共密封类工厂:工厂
其中TDerived:T,new()//编译器强制TDerived派生自T,并且它具有无参数构造函数
{
公共覆盖GetInstance()
{
返回Activator.CreateInstance();
}
}
公共类BarHandler
{
公共工厂工厂{get;set;}
公共ProcessedBar进程(字符串xml)
{
Foo-Foo=fooFactory.GetInstance();
返回foo.Process(xml);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
BarHandler=新的BarHandler();
handler.fooFactory=新的ActivatorFactory();
var processedResult=handler.Process(“Yar!”);
}
}

正确的想法错误的级别。我找到了如何使用泛型类,但我想使用类型的参数或字段。我正在扩展上面的示例以进行解释。正如我在TreDubZedd中所说的,我已经找到了泛型约束项,并在我得到的类级别上进行了操作。我正在专门研究类型类和限制的方法记下我愿意储存的类型。
public abstract class Factory<T>
{
    public abstract T GetInstance();
}

public sealed class IoCFactory<T, TDerived> : Factory<T>
    where TDerived : T // compiler enforces that TDerived derives from T
{
    public override T GetInstance()
    {
        // TODO: retrieve instance of TDerived from IoC container such as Spring.NET, StructureMap, Unity, etc.
        throw new NotImplementedException();
    }
}

public sealed class ActivatorFactory<T, TDerived> : Factory<T>
    where TDerived : T, new() // compiler enforces that TDerived derives from T and that it has a parameterless constructor
{
    public override T GetInstance()
    {
        return Activator.CreateInstance<TDerived>();
    }
}

public class BarHandler
{
    public Factory<Foo> fooFactory { get; set; }

    public ProcessedBar Process(string xml)
    {
        Foo foo = fooFactory.GetInstance();
        return foo.Process(xml);
    }
}

class Program
{
    static void Main(string[] args)
    {
        BarHandler handler = new BarHandler();

        handler.fooFactory = new ActivatorFactory<Foo, Bar>();

        var processedResult = handler.Process("<bar>Yar!</bar>");
    }
}