7

問題が発生しました - これらは私のクラス構造です

public interface IModel{}

public interface IGenericMapper<T> where T : IModel {...}

public class ActualModel:IModel {...}

public class ActualMapper: IGenericMapper<ActualModel> {...}

マッパーを初期化するための私の実際のコードは次のとおりです。

IGenericMapper<IModel> mapper;
mapper= new ActualMapper();

コンパイルされません。エラーが発生します

タイプ 'ActualMapper' を 'IGenericMapper' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

を使用してキャストするとき

mapper= new ActualMapper() as IGenericMapper<IModel>;

マッパーが適切に初期化されない (NULL として返される)

私が欠けているもの -マッパーをActualMapper()実装IGenericし、その型が「IModel」を実装しているため、マッパーを初期化できないのはなぜですか。

これを構造化して必要なものを達成する別の方法はありますか?

どうもありがとう

マッピングインターフェイスには次のメンバーがあるため、人々が提案したソリューションでは他のコンパイルエラーが発生することに注意してください

T GetModel(busO bBusinessObject);
busO  SetBusObject(T source, busO  target);

「out」で宣言されている場合、ジェネリック型を入力パラメーターとして使用できないようです

4

2 に答える 2

5

一般的な変更により、ここで共分散の領域に移行していることは間違いありません。

これを試して:

public interface IModel{}
public interface IGenericMapper< out T> where T : IModel{}
public class ActualModel : IModel{}
public class ActualMapper : IGenericMapper<ActualModel>   {}

その後:

IGenericMapper<IModel> blah = new ActualMapper();

「out T」なしでできる最善の方法は次のとおりです。

IGenericMapper<ActualModel> blah = new ActualMapper();

これはうさぎの穴なので、特に 2 つを混ぜようとする場合は注意してください :)

http://msdn.microsoft.com/en-us/library/ee207183.aspx

[編集]

generic をダウンキャストできるようにしたい場合は、そうするT必要outがあり、入力として使用することはできません。ただし、その一部を実装でリアルタイムに移動できます。つまり、モデル型にキャストできるかどうかを確認します。

interface IGenericMapper<out TModel, in TKeyOrIdent> 

TModel GetModel(TKeyOrIdent bBusinessObject);
void SetModel(object model, TKeyOrIdent target);
于 2013-08-16T13:26:01.010 に答える
4

定義する必要があります

IGenericMapper<out T>

シナリオをサポートしますが、これには他の制限が適用されます。

単純にIGenericMapper<IModel>!=IGenericMapper<ActualModel>であってもActualModel : IModel

ほとんどのシナリオでは、ジェネリックではない基本インターフェイスを持つことは理にかなっています。IList<T>たとえば、実装を参照してくださいIList

次に、実装を選択して、インターフェイス メンバーを明示的に実装できます。見るList<T>.GetEnumerator() : IEnumerable

どこでもキャストを排除できるという前提でジェネリックを使用しないでください。試してみましたが、C# にはこれに必要な機能がありません。

次に、ジェネリックコードを実行し、最後に(その時点ですでに型を持っています)それを特定の型にキャストするIGenericMapperための基本インターフェイスとしてインターフェイスを提案します。IGenericMapper<T>IGenericMapper

于 2013-08-16T13:25:09.127 に答える