汎用基本クラスを持つ汎用リポジトリを作成しようとしています。汎用汎用キーフィールドを持つ基本クラスを使用したC#の追加/付加
Fo rmyベースクラスです。私はそれによってT.Idがデフォルトの状態にあるかどうかに基づいて、追加または削除のいずれかの一般的なリポジトリへの拡張メソッドを追加するインターフェイス
public interface IEntity<T>
{
T Id { get; set; }
bool? Archived { get; set; }
}
と
public abstract class Entity<T> : IEntity<T>
{
public abstract T Id { get; set; }
[Column("IsArchived")]
public bool? Archived { get; set; }
}
ない。私の方法は以下の通りです。
public static TContext Attach<T, TKey, TContext>(this TContext context, T entity)
where T : class, IEntity<TKey>
where TContext : BaseDataContext
{
if (EqualityComparer<T>.Default.Equals(entity.Id, default(TKey)))
{
context.Set<T>().Add(entity);
}
else
{
context.Entry(entity).State = EntityState.Modified;
}
return context;
}
私はその後、私は一般的な方法「Repository.Extensions.Attachを使用して、エラー
エラー9を得る
public async Task<Entity<T>> SaveAsync<T, TKey>(Entity<T> entity, string userName) where T : class, IEntity<TKey>
{
this.Attach(entity);
await this.SaveChangesAsync();
return entity;
}
すなわちリポジトリから拡張メソッドを呼び出したいコール(TContext 、T) 'は3つの型引数を必要とします
これは、基本クラスがジェネリック型、つまりint型でない場合にうまくいきます。これを修正するには何を調整する必要がありますか?
何もあなたはありません調整することができます。コンパイラは 'TKey'引数を派生させることはできません。残念なことにこのような場合は、すべてのジェネリック型引数を指定する必要があります。 –