检测通用类型中的接口

时间:2009-07-15 15:34:56

标签: c# generics interface constraints

我有一个方法:

    public void StoreUsingKey<T>(T value) where T : class, new() {
        var idModel = value as IIDModel;
        if (idModel != null)
            Store<T>(idModel);

        AddToCacheUsingKey(value);
    }

我希望根据value参数的IIDModel实现调用以下方法。

    public void Store<T>(T value) where T : class, IIDModel, new() {
        AddModelToCache(value);
    }

有没有办法告诉Store<T>来自value的{​​{1}}参数是否实现StoreUsingKey<T>?或者我是以错误的方式解决这个问题?

答案

从每个方法中删除IIDModel约束允许代码工作。问题在于我试图将接口作为可以实例化的对象传递出来。

3 个答案:

答案 0 :(得分:5)

你已经是。通过将IIDModel约束放在Store&lt; T&gt;上。您保证,value参数实现IIDModel。

哦,好的,我现在看到你在说什么。怎么样:

public void StoreUsingKey<T>(T value) where T : class, new() {
                if (idModel is IIDModel)
                        Store<T>((IIDModel)idModel);

                AddToCacheUsingKey(value);
        }

再次编辑: Tinister是对的。这本身不会起作用。但是,如果您的Store方法看起来像Joel Coehoorn posted,那么它应该可以工作。

答案 1 :(得分:2)

public void Store(IIDModel value) {
    AddModelToCache(value);
}

答案 2 :(得分:1)

从每个方法中删除new()约束允许代码工作。问题在于我试图将接口作为可以实例化的对象传递出来。