私は、以下に示すようなジェネリック型のプロパティを持つクラスを持っています。明示的な変換なしで数値を処理する一般的な方法
public class EqualFilter <T> : Filter {
private T _value;
public override T Value {
get {
return _value;
}
set {
if (!EqualityComparer<T>.Default.Equals(_value, value)) {
_value = value;
RaiseFilteringChanged();
}
}
}
.....
}
(...短い、int型、float型)Tは、任意の数の可能なタイプ今、私は上記のセッターに渡される必要がある「文字列」を持つクライアントクラスを持っています。上記のセッターで値を設定する時点で、タイプTは既に実行時に決定されており、クライアントでタイプTとしてそのタイプを保持できます。クライアントプログラムでEqualFilterによって識別されるように、文字列を適切な型に変換することは可能ですか?これがうまくいかないようなもの
Type T = filter.getFilterType();
filter.Value = (T) myTextBox.Text;
以下のコードは機能しますが、数字でもよいすべての型に対してif-elseが関係します。
Type T = filter.getFilterType();
if (T == typeof(int)) {
filter.Value = Int32.Parse(myTextBox.Text);
} else if() {
....
}
簡潔に言えば、問題をより良い方法で解決する方法がわかりません。
「T」に型制約を付けることはできませんか? http://msdn.microsoft.com/en-us/library/d5x73970.aspx – Bazzz
私はあなたから提供された提案にどのようにアプローチするのか分かりません。あなたは私にいくつかの詳細を教えてください。また、Tにクラス制約を置くと、フィルタ値が比較的多数の行に対して値の比較に使用されるため、パフォーマンスが低下するでしょう。 – Jatin
これは 'T 'が受け入れる型の単なる制限です。現在のコードで 'T'をANY型にすることができます。これを特定のインターフェースに限定し、受け入れられたすべての型にこのインターフェースを実装させることができます。プリミティブ型では少し不安ですが、 'IComparable'は' T:IComparable'のように良いでしょう。比較の前に実際の型に 'T'をキャストする必要はありません。なぜなら、あなたのメソッドで終わるすべての' T'が 'IComparable'なので、' IComparable'に安全にキャストし、 'Compare'メソッドを使うことができるからです。 '((IComparable)T).Compare();'ではなく、あなたのすべてのキャストではありません。 – Bazzz