泛型问题

时间:2012-11-30 23:35:20

标签: c# asp.net c#-4.0 generics interface

我遇到了泛型问题:

public interface IEntity {}

public class User : IEntity {}

public class Experiments {
    private IList<IEntity> list;
    private IList<Action<IEntity>> actions;

    public Experiments(){
        list = new List<IEntity>();
        actions = new List<Action<IEntity>>();
    }

    public void Add<T>(T entity) where T : IEntity {
        list.Add(entity); // -> NO PROBLEM HERE
    }

    public void AddAction<T>(Action<T> handle) where T : IEntity {
        actions.Add(handle); // -> HERE I GET AN ERROR
    }

为什么我“无法转换为'System.Action&lt; T&gt;'到'System.Action&lt; IEntityCheck&gt; ...“一旦我在方法的签名上指定T是IEntity?

3 个答案:

答案 0 :(得分:3)

尝试:

public void AddAction(Action<IEntity> handle) 
{
    actions.Add(handle);
}

对于你的添加功能,不需要添加类型参数,只需使用界面。

public void Add(IEntity entity)
{
    list.Add(entity);
}

public void AddAction<T>(T entity) where T : IEntity的问题是我可以(如果有效)传递像Foo(ConcreteEntity entity)那样使用具体类的成员的函数,这个函数没有在接口上定义,那么我就不会能够循环遍历Actions<IEntity>列表并使用IEntity的其他实现调用它们并使它们都成功。

答案 1 :(得分:3)

我设法通过在类级声明泛型类型来编译它。

public interface IEntity { }

public class User : IEntity { }

public class Experiments<T> where T : IEntity
{
    private IList<T> list;
    private IList<Action<T>> actions;

    public Experiments()
    {
        list = new List<T>();
        actions = new List<Action<T>>();
    }

    public void Add(T entity)
    {
        list.Add(entity);
    }

    public void AddAction(Action<T> handle)
    {
        actions.Add(handle);
    }
}

答案 2 :(得分:2)

谢谢大家的答案,我找到了解决问题的方法。

我刚刚更改了操作 List&lt; Action&lt; T&gt;&gt;列出&lt; Delegate&gt; ,现在一切正常......

...
private IList<IEntity> list;
private IList<Delegate> actions;

public void AddAction<T>(Action<T> handle) where T : IEntity {
    actions.Add(handle);
}
...

感谢。