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;
}
4

5 に答える 5

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 の間のコンバーターがないため、そのままでは使用が非常に制限されます。どのような問題を解決しようとしていますか?

また、クレイジーな変換コードが含まれている別の質問も発見しました。

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

于 2009-02-26T23:37:24.343 に答える
1

//エラー:タイプ「Tsrc」を「Ttgt」に変換できません

アクセス可能な変換演算子がない限り、任意の型間で変換することはできません。

于 2009-02-26T23:16:18.420 に答える
1

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

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

private T MyMethod<T>(T source, T target)
{
于 2009-02-26T23:16:39.557 に答える
0

Convertクラスはまさにこの目的のために存在します。

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

また、これを行うことができることに注意してください:

    return (Ttgt) (object) SourceObject;
于 2009-08-03T21:37:46.183 に答える
0

これが「バイデザイン」です。関連のない 2 つの値の型の間でキャストしようとしています。これは決して成功しないため、エラーとしてフラグが立てられます。

これは、暗黙的にシールされているため、すべての値タイプに当てはまります。TSrc -> Ttgt 間のキャストが成功するためには、2 つの型の間にクラス階層関係が存在する必要があります。これは、すべての値の型が封印されているためではありません。

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

于 2009-02-27T04:43:39.117 に答える