私は、ユーザーがKPI、チャート、集計関数、およびその他のパラメータのセットから選択できる、単純なレポートツールを作成しようとしています。その後、ボタンをクリックしてから、wcfサービスすべてのデータを含むカスタムモデルを返します。これは、MVC/WPFアプリケーションで表示できます(両方の可能性があります)。セミアドホックレポートの一般的なインターフェイス
ユーザーはいくつかの国にいる可能性があるため、データアノテーションを使用して、現在のユーザーが使用していた言語と数値の形式に適した方法ですべての数値とヘッダーを似ているようにしたい。
データの読み込みとそのすべての処理は問題なく動作しています。また、私はデータアノテーションを使用しているので、すべての言語/カルチャー固有の設定が気になります。問題は、ユーザーに表示したいモデルにすべてのデータを入れるときに始まります。
私がしようとしているのは、列のコレクションを含むReportクラスです。各列はint/double/...の値のリストです。さて、私はWCFを扱っているので、上記の説明はジェネリックの使用を(私が理解している範囲で)暗示しています。クラス/ wcf操作に[KnownType]または[ServiceKnownType]を使用できます。戻り値として基本型またはインタフェース。決して実際にこれを試したことはありませんが、私にはかなり論理的な説明がありましたので、私はこの部分に大きな問題はないと思います。
は今のところ、私のインターフェイスは、(私が持っている実際の問題に焦点を当てるために簡略化)などのようになります。
public interface IReport<T> where T: IConvertible { ICollection<IColumn<T>> Columns { get; set; } }
public interface IColumn<T> where T: IConvertible { ICollection<IValue<T>> Values { get; set; } }
public interface IValue<T> where T: IConvertible { T Value { get; set; } }
各列の値が/ダブル/ ...、私は仮定int型かもしれないので、私は価値のために実際のクラスを持っている必要がありますよう、(私はコレクション型にデータ注釈属性を使用することができるとは思わない):もちろん
public class IntValue: IValue<int>
{
[DisplayFormat(DataFormatString = "{0:#,##0;-#,##0;'---'}", ApplyFormatInEditMode = true)]
public int Value { get; set; }
}
を、それは奇妙に見えますが、あなただけの可能性があるのでそれを一般的なクラスにしてくださいIValueを実装し、それを使って行う価値ですが、私がばかげたことをすれば私はDisplayFormat属性を使用することができ、それがユーザーに表示される方法について心配する必要はありません。常に適切です。
さて、IColumnとiReportはを実装するクラスのために、それは簡単です:
public class Report<T>: IReport<T> where T: IConvertible
{
public ICollection<IColumn<T>> Columns { get; set; }
public Report() { Columns=new List<IColumn<T>>(); }
}
public class Column<T>: IColumn<T> where T: IConvertible
{
public ICollection<IValue<T>> Values { get; set; }
public Column() { Values = new List<IValue<T>>(); }
}
インタフェースとクラスのリストから、あなたはすぐに、これはそれが不可能ないくつかの列のレポートを持ってできることがわかります他のタイプがあります。したがって、いくつかの列がintで、いくつかがdoubleであるレポートを作成することはできません... IReportのジェネリック制約により、型を指定するため、すべての列に対してその制約が適用されます。各列...それはまさに私が本当に望むものです。
私はどこにもいないと思うし、何かが本当にシンプルでないかもしれないと思うので、適切な方向に微妙な感覚を感じる。
TL; DR:ジェネリックコレクションを非ジェネリックタイプで取得するにはどうすればよいですか?
「新しいIReport」としてレポートを作成できませんか? –
Baldrick
私が今見ているところでは、IConvertibleであると期待しているので、int型またはdouble型の列を追加することはできません。IConvertible実装クラスではありません。 –