C# 检测泛型类型中的接口

C# 检测泛型类型中的接口,c#,generics,interface,constraints,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); } 有没有办法告诉Store来自Store

我有一个方法:

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

        AddToCacheUsingKey(value);
    }
有没有办法告诉
Store
来自
StoreUsingKey
value
参数实现了
IIDModel
?还是我走错了方向

丰富的

回答


从每个方法中删除
new()。问题在于我试图将接口作为一个可以实例化的对象进行传递。

您已经做到了。通过将IIDModel约束放在Store方法上,可以保证value参数实现IIDModel

哦,好吧,我明白你在说什么了。这个怎么样:

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

                AddToCacheUsingKey(value);
        }
public void StoreUsingKey(T值),其中T:class,new(){
if(idModel为IIDModel)
存储((IIDModel)idModel);
AddToCacheUsingKey(值);
}

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

您已经做到了。通过将IIDModel约束放在Store方法上,可以保证value参数实现IIDModel

public void Store(IIDModel value) {
    AddModelToCache(value);
}
哦,好吧,我明白你在说什么了。这个怎么样:

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

                AddToCacheUsingKey(value);
        }
public void StoreUsingKey(T值),其中T:class,new(){
if(idModel为IIDModel)
存储((IIDModel)idModel);
AddToCacheUsingKey(值);
}

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

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

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

但是StoreUsingKey方法没有此约束。我如何有选择地给商店打电话?上面的示例错误为“无法从'IIDModel'转换为'T'”。这似乎不起作用:'IIDModel'必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型中的参数'T'或方法'Store(T)'对其进行排序,类约束是令人费解的。我限制太多了。通过从两个方法中删除类约束,代码开始工作。谢谢您的帮助。但是StoreUsingKey方法没有此约束。我如何有选择地给商店打电话?上面的示例错误为“无法从'IIDModel'转换为'T'”。这似乎不起作用:'IIDModel'必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型中的参数'T'或方法'Store(T)'对其进行排序,类约束是令人费解的。我限制太多了。通过从两个方法中删除类约束,代码开始工作。谢谢你的帮助。对不起,我应该说得更清楚些。AddModelToCache方法在本质上也是泛型的。对不起,我应该更明确一些。AddModelToCache方法在本质上也是通用的。
public void Store(IIDModel value) {
    AddModelToCache(value);
}