Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有泛型约束的泛型接口无法强制转换_C#_Generics_Interface_Casting_Covariance - Fatal编程技术网

C# 具有泛型约束的泛型接口无法强制转换

C# 具有泛型约束的泛型接口无法强制转换,c#,generics,interface,casting,covariance,C#,Generics,Interface,Casting,Covariance,我有一个通用接口,它有一个接口约束,由于 协方差我不能按我想的那样施展。必须依靠动态。理想情况下,我想远离这一点,但找不到一个方法来做到这一点 我们可以将此问题视为类似于WebApi控制器的问题。 我会让一根绳子和一个有效载荷一起进来。根据字符串名称,我需要选择适当的“策略”(控制器/方法)来运行和传递有效负载 我还希望它能够自动工作,这意味着:我有一些“反射”代码,用于查找所有使用IAnimalAction的类,将它们加载到集合中,并设置DI容器。所有这些都是正确的 正如您在代码中所看到的,动

我有一个通用接口,它有一个接口约束,由于 协方差我不能按我想的那样施展。必须依靠动态。理想情况下,我想远离这一点,但找不到一个方法来做到这一点

我们可以将此问题视为类似于WebApi控制器的问题。 我会让一根绳子和一个有效载荷一起进来。根据字符串名称,我需要选择适当的“策略”(控制器/方法)来运行和传递有效负载

我还希望它能够自动工作,这意味着:我有一些“反射”代码,用于查找所有使用IAnimalAction的类,将它们加载到集合中,并设置DI容器。所有这些都是正确的

正如您在代码中所看到的,动态工作非常完美,但是我希望避免运行时异常,并在构建时使用它们

公共接口IAnimalType
{ }
公共类Cat:IAnimalType
{公共字符串名称;}
公共级犬:IAnimalType
{public int;}
公共类Cow:IAnimalType
{ }
公共接口IAnimalAction,其中T:IAnimalType
{
布尔动作(T输入);
}
公共类无意识动物:Ianimaction
{
公共布尔动作(Cat输入)
{
返回true;
}
}
公共类动物:IAnimalAction,IAnimalAction
{
公共布尔行动(狗输入)
{
返回true;
}
公共布尔行动(奶牛输入)
{
返回true;
}
}
公开课考试
{
公开考试()
{
var cat=新cat();
var ignoreAction=SomeStaticInstance.GetRelevantAction(cat.GetType().Name);//在本例中返回新的IgnoreActive()
var works=((IANIMACTION)信号作用)。动作(cat);
var alsoWorks=((动态)信号动作).ACTON(cat);
var doesnt=((IANIMACTION)ignoreAction).acton(constraint);
}
}
我希望能够确保“Acton”方法在我的实例上始终可用

我理解协方差和逆方差的问题,但我认为一定有其他不依赖于动态的方法

由于我通过反射加载类,并且只加载实现“interface IAnimalAction”的类,因此我认为保持原样是安全的,可以选择在接口中查找方法名称,并让代码调用解析的方法名称,而不是硬代码“Acton”


将示例更新为不那么抽象,而不是
var test=new test1()=>
var测试=新逻辑1()?是的,sry是正确的。这是正确的:您收到一个
字符串
,它告诉您所拥有的东西的类型,并根据该字符串为任何负载选择一个处理程序。该有效负载是由泛型类型指定的吗?(如果代码更接近您描述的内容,这可能会有所帮助-像
Constraint1
这样的名称实际上是抽象的,使其更难可视化。)如果处理程序是基于字符串而不是类型选择的,这可能会使这更简单一些。为什么要添加相应的
ITester
no选项?另外,为什么添加一个非通用的
ITester
接口没有选择?我认为我们可以将其视为“通用策略模式”。每个约束都是对某些逻辑的“契约”。所以我的意思是,我有一个方法,比如void execute(iConstraint contract){var name=contract.GetType().name;var logic=publicmapper.Get(name);(logic).TesterMethod((动态)约束);}。逻辑是动态的,但它是logic1,也可以是logic2,取决于名称变量。