如何在接口中使用通用委托

时间:2011-09-30 13:21:08

标签: c# generics interface delegates

我正在尝试创建一个包含泛型委托的接口。然后我希望实现接口的类决定实际的类型方法,或者最好甚至返回另一个委托。

以下是一些描述我正在努力实现的内容的代码。

public delegate void GenericMethod<T>(T arg);
public delegate void StringMethod(string str);
public delegate void ByteMethod(byte bt);

public interface ITest
{
    GenericMethod<T> someMethod;    
}

public class TestA : ITest
{
    public GenericMethod<string> someMethod
    {
         get 
         {
               return stringMethod; //which is of type StringMethod(string str), defined above
         }
    }
}

public class TestB : ITest
{
    public GenericMethod<byte> someMethod
    {
         get 
         {
               return byteMethod; //which is of type ByteMethod(byte bt);, defined above
         }
    }
}

这可能吗?或者以这种方式切换代表是不可能的?

3 个答案:

答案 0 :(得分:0)

如果不使接口通用,我认为这是不可能的。常见的实施方式是:

public interface ITest<T>
{
    GenericMethod<T> someMethod;
}

或者,如果您想要实际使用非通用接口,请使用:

public interface ITest
{
    GenericMethod<object> someMethod;
}

您还可以查看两个接口IEnumerableIEnumerable<T>,了解如何组合通用接口和非通用接口。只需明确实现非泛型接口,以便在不关心具体类型时使用。

答案 1 :(得分:0)

public delegate void GenericMethod<T>(T arg);
public delegate void StringMethod(string str);
public delegate void ByteMethod(byte bt);

public interface ITest<T>
{
    GenericMethod<T> someMethod { get; };
}

public class TestA : ITest<string>
{
    public GenericMethod<string> someMethod
    {
        get
        {
            return stringMethod; //which is of type StringMethod(string str), defined above
        }
    }
}

public class TestB : ITest<byte>
{
    public GenericMethod<byte> someMethod
    {
        get
        {
            return byteMethod; //which is of type ByteMethod(byte bt);, defined above
        }
    }
}

答案 2 :(得分:0)

由于继承原则,你不能这样做。在ITest中有效的所有应该在派生类/接口中工作。这意味着,如果我能够使用

GenericMethod<int> someMethod
在ITest中

(看看int),我应该能够在TestA和TestB中使用它。您试图忽略此限制