我已经创建了一个接口,以便我可以尝试使一些重复的代码通用.
public interface IIdentifiable<T>
{
T Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个与实体一起工作的类,其约束条件为 IIdentifiable<T>
public class MyClass<TEntity, TId>
where TEntity : IIdentifiable<TId> {}
Run Code Online (Sandbox Code Playgroud)
但是现在每当我使用时MyClass我都必须传入,TId即使只有一种有效类型TId.
public class MyEntity : IIdentifiable<Guid> {}
var foo = new MyClass<MyEntity>(); // Error
var bar = new MyClass<MyEntity, Guid>();
Run Code Online (Sandbox Code Playgroud)
在C++中我可以这样做:
template<typename T>
struct IIdentifiable
{
using id_type = T;
T id;
};
template<typename TEntity, typename TId = typename TEntity::id_type>
struct MyClass {};
MyClass<MyEntity> foo;
Run Code Online (Sandbox Code Playgroud)
是否有C#等价物?
只有一种有效的类型
TId
错误!:)
反例:
public class MyEntity : IIdentifiable<Guid>
{
public Guid Id { get; set; }
}
public class MyOtherEntity : MyEntity, IIdentifiable<int>
{
int IIdentifiable<int>.Id { get; set; }
}
var foo = new MyClass<MyOtherEntity>(); // So, which IIdentifiable should be used?
Run Code Online (Sandbox Code Playgroud)
此外,C#泛型不像C++模板那样工作,它们在运行时具有固定性并且具有不同的约束.