0

次のような基本クラスがあります。

public abstract class MetadataBase : NgageControl, INamingContainer, IValidator
{
    public abstract Type DataType { get; }
    public string SerializedData { get; set; }
    ....
}

次に、上記のものを拡張するジェネリック クラスがあります。

public abstract class MetadataBase<Tdata, Traw, Tsettings> : MetadataBase
    where Tdata : new()
    where Tsettings : new()
    where Traw : INgageData
{
     ....
}

次に、このようなクラスに基づいた一連のクラスがあります。

public class MetadataDateTime : MetadataBase<MetadataDateTimeData, NgageDateTime, MetadataDateTimeSettings>
{
public override Type DataType { get {return typeof(MetadataDateTimeData); } }
     ....
}

このアプローチの理由は、次のようなことができるようにするためです。

MetadataBase test = GetMetaData();
XmlSerializer xs = new XmlSerializer(test.DataType);
xs.Deserialize();
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(test.SerializedData));
_xs.Deserialize(ms);
ms.Dispose();

Type.GetGenericArguments メソッドから MetadataDateTimeData 型を取得できたかもしれませんが、パフォーマンスが遅いため、リフレクションの使用を開始したくなかったのです。正しいかどうかはわかりませんが、オーバーライドされたプロパティから型を取得しているようです。はるかに高速になります。

これはすべて正常に機能しますが、タイプを静的に取得することをサポートする必要があるようです。現在、データを逆シリアル化するために Type を取得するためだけにこのクラスのインスタンスを作成しています。このアプローチはパフォーマンスを大幅に低下させるため、属性を使用してデータ クラスを指定することを考えていました。ただし、これに関する問題は、リフレクションを使用して属性を読み取る必要があるため、GetGenericArguments メソッドを使用することもできます。

何をすることをお勧めしますか?

ありがとう、

ジョー

4

0 に答える 0