2017-04-03 4 views
-2

で一般的なプロパティを作成します。私はこのような1つの抽象ジェネリッククラス持つ非ジェネリッククラス

public abstract class ServicoAbstrato<TEntity, TId> 
    where TEntity : EntidadeBasica<TId> 
    where TId : IEquatable<TId> 
{ 
    protected IDao<TEntity, TId> dao; ... 
} 

public abstract class EntidadeBasica<TId> 
    where TId : IEquatable<TId> 
{ ... } 

をし、私はこのような別のクラスでは、このジェネリッククラスのプロパティを持つようにしたい:

[AttributeUsage(AttributeTargets.Property | AttributeTargets .Field)] 
public class ServicesAttribute : HandlerAttribute 
{ 
    public ServicoAbstrato<EntidadeBasica<Type>, Type> servico { get; set; } 

    public override ICallHandler CreateHandler(IUnityContainer container) 
    { 
     return new ServicesHandler(servico); 
    } 
} 

それは私に次のエラーを与える:

The type 'System.Type' cannot be used as type parameter 'TId' in the generic type or method 'Servico.ServicoAbstrato'. There is no implicit reference conversion from 'System.Type' to 'System.IEquatable'

この問題を解決するにはどうすればよいですか?

+1

を使用することができ、あなたがcontstraint 'TID持っている:IEquatable を'、と 'type'がが' 'IEquatable ではありません – Jonesopolis

+0

マークされた重複と同じように、ジェネリック型パラメータとして使用しようとしている型は、ジェネリック宣言で型パラメータを実装する必要があるインターフェイスを実装していません。 –

答えて

0

TIdが定義されている場所でTypeを使用しています。そしてwhere節の制限としてTIdがあります。したがって、タイプはIEquatable<TId>でなければなりません。

Type(少なくともType)はマイクロソフトのクラスであり、この条件を満たしていません。

あなたがインターフェイスIEquatable<T>を実装するクラスEquatable<T>どこかを持っている場合、あなたはかなり簡単

public ServicoAbstrato<EntidadeBasica<Type>, Equatable<Type>> servico { get; set; } 
関連する問題