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);
}