我实现了一个抽象的CustomUser
类来自定义Asp.Net Identity,如下所示:
public abstract class CustomUser<TKey, TContext> : IUser<TKey>, IEntity<TKey>
where TKey : struct, IComparable<TKey>, IEquatable<TKey>
where TContext : DataContextBase
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public TKey Id { get; set; }
public string UserName { get; set; }
}
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(CustomUserManager<CustomUser<TKey, TContext>, TKey, TContext> manager)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
return userIdentity;
}
其中IEntity
是:
public interface IEntity<T>
where T : IComparable
{
T Id { get; set; }
}
和 IComparable 是:
public interface IComparable<in T>
{
int CompareTo(T other);
}
和IEquatable<T>
是UserManager
所需的):
public interface IEquatable<T>
{
bool Equals(T other);
}
但我收到以下错误:
类型
'TKey'
不能用作通用中的类型参数'TKey'
类型或方法'XXX.CustomUserManager<TUser,TKey,TContext>'
。有 没有装箱转换或类型参数从'TKey'
转换为'System.IEquatable<TKey>'
。
TKey
会继承IComparable
和IEquatable
,否则会收到更多错误。你能解释一下为什么会发生这种冲突吗?
答案 0 :(得分:0)
我认为它应该是一些隐式运算符,但是没有办法在这两个接口之间进行转换
public static implicit operator IEquatable<T> (IComparable<T> obj)
{
return ???;
}
也许您可以尝试扩展 IEntity 以实现IEquatable
public interface IEntity其中T:IComparable,IEquatable