我正在为我的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) 我正在实现一个存储库,并且一直在想使它对用户更友好。现在,我有一个IEntity指定Id字段的接口:
public interface IEntity<T>
{
T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的存储库允许用户通过该ID获取新实例。现在它可以处理的类型需要实现IEntity接口,因此我对存储库Get方法有一个通用约束:
public class Repository
{
public T Get<T, U>(U id) where T: IEntity<U>
{
// fake implementation, but T is required at compile time
var result = Activator.CreateInstance<T>();
result.Id = id;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
在T和之间存在一个明显的关系,U并且编译器充分理解它可以标记未使用情况,但不足以启用类型推断-每次调用都Get需要显式指定泛型参数。我知道没有办法指定T,但是如何改善方法签名,以便U不需要指定呢?现在,对于最常见的用法,我有一个重载:
public T Get<T>(int id) where T : IEntity<int>
{
return Get<T, int>(id);
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以通过某种方式将开放的通用接口指定为约束,或者对于一般情况,哪种方法更好?