私がまとめているオブジェクトは、オブジェクトが同じタイプの別のオブジェクトによって変換できるものとして自分自身を公開できるようにすることです。マージの行に沿って考えると、操作は一般的ではなく、単純にすべてのプロパティを取得して所定の操作を実行するためにリフレクションを使用することはできません。そこで、私はそれをTransformableとして公開するオブジェクトとして実装し、変換を実行する方法を知っているオブジェクト(入れ替えることができる)をオブジェクトにアタッチすることに決めました。私がこれまで持ってコンパイルコードは次のとおりです。あなたが見ることができるようにC#このキーワードを使用するときのジェネリック型
public interface ITransformer<TType> where TType : class
{
void Transform(TType source, TType destination);
}
public interface ITransformable<TType> where TType : class
{
bool Locked { get; set; }
ITransformer<TType> Transformer { get; set; }
void TransformFrom(TType source);
}
public class MyTransformer : ITransformer<MyTransformable>
{
public void Transform(MyTransformable source, MyTransformable destination)
{
// Perform some logic for the transform
}
}
public class MyTransformable : ITransformable<MyTransformable>
{
public bool Locked { get; set; }
public ITransformer<MyTransformable> Transformer { get; set; }
public string Value1 { get; set; }
public uint Value2 { get; set; }
public bool Value3 { get; set; }
public void TransformFrom(MyTransformable source)
{
Transformer.Transform(source, this);
}
}
、タイプMyTransformableは、いくつかのデータ(値1 - VALUE3)が含まれてだけでなく、ロック状態とトランスオブジェクトが知っているだろうこのアイテムの変換をどのように行うか(MyTransformerタイプで動作可能なトランスフォーマーのみが許可されたジェネリック)。
私の問題は、私はタイプ変換可能のすべての新しいオブジェクトが
public void TransformFrom(MyTransformable source)
{
Transformer.Transform(source, this);
}
へのコールを繰り返す必要はしたくないということですので、私は
に MyTransformableオブジェクトの変更を追加することができます期待していましたpublic abstract class Transformable<TType> : ITransformable<TType> where TType : class
{
public bool Locked { get; set; }
public ITransformer<TType> Transformer { get; set; }
public void TransformFrom(TType source)
{
Transformer.Transform(source, this); // ERROR! this is type Transformable<TType> not TType
}
}
public class MyTransformable : Transformable<MyTransformable>
{
}
もちろん、これは私が強調しているエラーのためにコンパイルされません。私はラインのどこかでポイントを逃したように感じる。誰かがこれについて正しい方向に私を指すことができますか?
これがうまくいくと思いますか?「変形可能な」? 'this'が' int'型になることはありません。 –
可逆変換を行っている場合は、代わりにクラスのキャスト演算子を実装することができます。 http://msdn.microsoft.com/en-us/library/z5z9kes2(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/xhbhezf4(v=vs.100) 。aspx – JamieSee
「ITransformer」と「ITransformable 」にいくつかの一般的な制約を適用する必要があります。 –