我正在为我的IoC类库重写我的流畅界面,当我重构一些代码以便通过基类共享一些常用功能时,我遇到了麻烦.
注意:这是我想要做的事情,而不是我必须做的事情.如果我必须使用不同的语法,我会,但如果有人知道如何使我的代码按我想要的方式编译,那将是非常受欢迎的.
我希望某些扩展方法可用于特定的基类,并且这些方法应该是通用的,具有一个泛型类型,与方法的参数相关,但是这些方法也应该返回与特定后代相关的特定类型.被引用.
使用代码示例比上面的描述更好.
这是一个简单而完整的例子,它不起作用:
using System;
namespace ConsoleApplication16
{
public class ParameterizedRegistrationBase { }
public class ConcreteTypeRegistration : ParameterizedRegistrationBase
{
public void SomethingConcrete() { }
}
public class DelegateRegistration : ParameterizedRegistrationBase
{
public void SomethingDelegated() { }
}
public static class Extensions
{
public static ParameterizedRegistrationBase Parameter<T>(
this ParameterizedRegistrationBase p, string name, T value)
{
return p;
}
}
class Program
{
static void Main(string[] args)
{
ConcreteTypeRegistration ct = new ConcreteTypeRegistration(); …Run Code Online (Sandbox Code Playgroud) 我有一个具有此成员的接口(由存储库使用):
T FindById<T, TId>(TId id)
where T : class, IEntity<TId>
where TId : IEquatable<TId>;
Run Code Online (Sandbox Code Playgroud)
这允许调用者指定实体类型(T)及其Id字段类型(TId).然后,此接口的实现者将查找类型的实体,T并使用该id参数根据其id(已定义IEntity<TId>)对其进行过滤.
目前我这样称呼它:
int id = 123;
var myApproval = PartsDC.FindById<Approval, int>(id);
Run Code Online (Sandbox Code Playgroud)
理想情况下我想这样做:
int id = 123;
var myApproval = PartsDC.FindById<Approval>(id);
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这个问题的答案:
我知道我不能得到我想要的语法,但可以接近.由于我的通用参数约束,我无法在我的情况下完全设置它.
这是我到目前为止所拥有的:
public class FindIdWrapper<T> where T : class
{
public readonly IDataContext InvokeOn;
public FindIdWrapper(IDataContext invokeOn)
{
InvokeOn = invokeOn;
}
T ById<TId>(TId id) where TId : IEquatable<TId>
{
return InvokeOn.FindById<T, …Run Code Online (Sandbox Code Playgroud)