2

我面临一个泛型问题:

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
    }

为什么一旦我在方法的签名上指定 T 是 IEntity,我会得到“无法从 'System.Action<T>' 转换为 'System.Action<IEntityCheck>...” ?

4

3 回答 3

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并让它们都成功。

于 2012-11-30T23:50:01.710 回答
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);
    }
}
于 2012-11-30T23:53:10.227 回答
2

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

我刚刚将动作List<Action<T>> 更改为 List<Delegate>现在一切正常......

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

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

谢谢。

于 2012-12-01T00:36:22.757 回答