C# 泛型方法参数
C# Generic method param
我正在尝试创建一个简单的服务,其中派生的 classes 可以通过传入自己的对象来覆盖虚拟方法。似乎无法正确使用语法。请看下面的代码:
所以基数class如下:
public class FooBase
{
public virtual Task StartFooAsync<TParam>(TParam param) where TParam : IFooParam
{
Console.WriteLine(param.GetType());
return Task.CompletedTask;
}
}
和IFooParam
界面:
public interface IFooParam
{
public string Title { get; set; }
}
实现这个简单接口的class是:
public class FooParam : IFooParam
{
public string Title { get; set; }
}
现在,当我尝试继承 FooBase class 时:
public class FooOne : FooBase
{
public override Task StartFooAsync(FooParam param) // wont compile :(
{
return base.StartFooAsync(param);
}
}
我收到编译时错误,告诉我没有合适的方法可以覆盖 StartFooAsync
这里的目标是从 FooBase
class 继承并提供自己的实现,其首选类型作为 StartFooAsync
的参数
不,如果虚方法是泛型方法,覆盖也必须是泛型方法。泛型方法允许 调用者 指定类型参数。
以下是您的代码为何无法运行的示例...这应该是完全有效的:
class OtherParam : IFooParam
{
public string Title { get; set; }
}
FooBase x = new FooOne(); // FooOne derives from FooBase
var p = new OtherParam { Title = "xyz" };
x.StartFooAsync<OtherParam>(p);
FooBase
的声明中没有任何内容会阻止编译...但是您还没有提供可以处理 OtherParam
的 StartFooAsync
的实现。
另一种方法是使 FooBase
通用:
public class FooBase<TParam> where TParam : IFooParam
{
public virtual Task StartFooAsync(TParam param)
{
...
}
}
那么您的 FooOne
将派生自 FooBase<FooParam>
。这将防止我之前展示的损坏代码,因为 x
将被声明为 FooBase<FooParam>
或 FooOne
,而 StartFooAsync
方法将 only接受FooParam
.
我正在尝试创建一个简单的服务,其中派生的 classes 可以通过传入自己的对象来覆盖虚拟方法。似乎无法正确使用语法。请看下面的代码:
所以基数class如下:
public class FooBase
{
public virtual Task StartFooAsync<TParam>(TParam param) where TParam : IFooParam
{
Console.WriteLine(param.GetType());
return Task.CompletedTask;
}
}
和IFooParam
界面:
public interface IFooParam
{
public string Title { get; set; }
}
实现这个简单接口的class是:
public class FooParam : IFooParam
{
public string Title { get; set; }
}
现在,当我尝试继承 FooBase class 时:
public class FooOne : FooBase
{
public override Task StartFooAsync(FooParam param) // wont compile :(
{
return base.StartFooAsync(param);
}
}
我收到编译时错误,告诉我没有合适的方法可以覆盖 StartFooAsync
这里的目标是从 FooBase
class 继承并提供自己的实现,其首选类型作为 StartFooAsync
不,如果虚方法是泛型方法,覆盖也必须是泛型方法。泛型方法允许 调用者 指定类型参数。
以下是您的代码为何无法运行的示例...这应该是完全有效的:
class OtherParam : IFooParam
{
public string Title { get; set; }
}
FooBase x = new FooOne(); // FooOne derives from FooBase
var p = new OtherParam { Title = "xyz" };
x.StartFooAsync<OtherParam>(p);
FooBase
的声明中没有任何内容会阻止编译...但是您还没有提供可以处理 OtherParam
的 StartFooAsync
的实现。
另一种方法是使 FooBase
通用:
public class FooBase<TParam> where TParam : IFooParam
{
public virtual Task StartFooAsync(TParam param)
{
...
}
}
那么您的 FooOne
将派生自 FooBase<FooParam>
。这将防止我之前展示的损坏代码,因为 x
将被声明为 FooBase<FooParam>
或 FooOne
,而 StartFooAsync
方法将 only接受FooParam
.