2009-02-26 20 views
1

値型間で値をコピーする汎用メソッドがあります。次のアプローチでは、構造体の制約があっても、設計時エラーが発生します。どのように私は値の間にコピーまたはキャストすることができますか?値型制約付きの汎用宣言型のコピー方法

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc SourceObject) 
    where Tsrc : struct 
    where Ttgt : struct 
{ 
    //Error:cannot implictly convert type 'Tsrc' to 'Ttgt' 
    Ttgt returnObject = SourceObject; 

    //Error:Cannot convert type 'Tsrc' to 'Ttgt' 
    Ttgt returnObject = (Ttgt)SourceObject; 

    return returnObject; 
} 

答えて

3

は、あなたが少し反射魔法の間で変換しようとしているタイプの登録型コンバータは、トリックを行う可能性があることを考える:

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc sourceObject) 
    where Tsrc:struct where Ttgt:struct  
{  
    Type targetType = typeof(Ttgt); 
    TypeConverter tc = TypeDescriptor.GetConverter(targetType); 
    Ttgt returnObject = (Ttgt)tc.ConvertTo(sourceObject, targetType); 
    return returnObject;  
} 

たとえば、boolとintの間にコンバーターがないので、非常に限られた使用になります。どのような問題を解決しようとしていますか?

私はまた別のquestionを見つけました。そこにはいくつかの狂った変換コードがあります。

編集: あなたのコメントは、ドメインオブジェクトとある種のビュー/契約モデル間のオブジェクトからオブジェクトへのマッピングを実行しようとしていることを明確にしています。 AutoMapperを見ましたか?

+0

を私は再帰的なオブジェクト間マッパーを書いています:

private Ttgt MyMethod<Tsrc, Ttgt>(Tsrc SourceObject) where Tsrc : struct where Ttgt : struct { return (Ttgt) Convert.ChangeType(SourceObject, typeof(Ttgt)); } 

はまた、あなたがこの操作を行うことができることに注意してください。 WCF実装の基本的なビジネスロジッククラスからコントラクトクラスを分離することです。実装クラスは契約とほぼ同じですが、私はその2つの間に依存関係を導入したくありません。 –

+0

これは言うべきです:タイプtargetType = typeof(Ttgt); –

+0

ありがとうございます。変数名が正しく更新されました。 – PHeiberg

1

//Error:Cannot convert type 'Tsrc' to 'Ttgt'

アクセス変換演算子がない限り、あなたは、任意のタイプの間で変換することはできません。

1

2つは異なるタイプとして定義されています。それらは両方とも構造体ですが、同じ型ではありません。

同じタイプとして源泉とターゲットの両方を定義します。

private T MyMethod<T>(T source, T target) 
{ 
0

これは「設計による」です。関係のない2つの値の型をキャストしようとしています。これは決して成功しないため、エラーとしてフラグが立てられます。

これは、暗黙的にシールされているため、すべての値の型に当てはまります。 TSrc - > Ttgtの間のキャストが成功するためには、2つのタイプの間にクラス階層関係がなければなりません。これは、すべての値型が密封されているため、他の値型から派生することができないためではありません。

これが成功する唯一の方法は、タイプ間にカスタム変換演算子がある場合です。これは事実かもしれません。しかし、ジェネリック型を扱う場合、カスタム変換演算子は処理されません。

0

この正確な目的のためにConvertクラスが存在します。

return (Ttgt) (object) SourceObject; 
関連する問題