2012-03-13 12 views
1

私は、次のクラスがあるとします。指定ジェネリック医薬品は、フィールドを使用してタイプ

MyClass myClass = new MyClass(); 
myClass.myDecimal = row.Field<decimal>("MyDecimalColumnName"); 
myClass.myString = row.Field<string>("MyStringColumnName"); 
:、私はそうのようなクラスを

public class MyClass 
{ 
    public decimal myDecimal; 
    public string myString; 
} 

私はDataRowExtensions方法現在Field<>

を使用したい使用しています

しかし、もし私がdecimal以外の何かにmyDecimalの型を変更することを決心したなら、私はrow.Fieldへの呼び出しをrefleにしたい正しいデータを確認してください。

私は、次の構文に似た何かをしたい:

myClass.myDecimal = row.Field<typeof(myClass.myDecimal)>("MyDecimalColumnName"); 

これはコンパイルできない、と私はそれが呼ばれることになるものは何でも、ちょうどdecimalを返すためにtypeofまたはGetType()を使用する方法が分からないし。

これを行う方法はありますか。コンパイル時に型がすでに分かっているので、ジェネリックはコンパイル時の構造体なので、これを実現できると思いました。

ありがとうございます!

+0

は[こちら](http://stackoverflow.com/q/196936/754438) – Reniuz

+0

*は、コンパイラができない顔をしていますその型パラメータを推論する? – davisoa

+2

@davisoa *返品*の値ではない、いいえ –

答えて

5

まず、パブリックフィールドは通常非常に悪い考えです。これがプライベートバッキングフィールドであると仮定すると、2つの興味深いオプションがあります。

第1は、一般的な型推論を利用することです。これはリターンタイプのために働くが、あなたが持っていることができるように、パラメータの場合としない:それはある

row.GetField("MyDecimalColumnName", out obj.someField); 

GetField<T>(string name, out T value); 

もう一つのトリックは、暗黙的な演算子を使用することであろうが、すなわちGetField(string)に、暗黙的な変換演算子を持ったダミーオブジェクトをint,decimalなどのような少数の型に戻して、演算子で作業/変換を行います。ビットハックが、うまくいく - 構文は次のようになります

myClass.myDecimal = row.Field("SomeColumn") 

で:

SomeDummyType GetField(string name); 

SomeDummyType暗黙静的変換演算子またはいくつかを有します。

ただし、 IMO 最高のオプションは、ORMやmicro-ORMなどのツールを使用して値をロードすることです。DataRowはまったく使用しないでください。 .Field<T>は本当に多くのあなたにすべてのことを助けている - 私は意味

myClass.myDecimal = (decimal)row["SomeColumn"]; 

別の簡単なオプションは、単に古い学校に行くことですか?あなたは真剣にあなたのクラスを頻繁にリファクタリングしますか?これはそれについて心配する価値がありますか?

+0

あなたの 'row.GetField'提案が気に入っていますが、どうして返り値の型を明示的に設定できないのか不思議です。 'Field 'の使用については、null可能な型を使用するのに役立ちます(DataRowはnull許容列に対しては 'DBNull.Value'を返し、存在しない列に対しては' null'を返します)。たとえば、 'decimal? x =(decimal?)row ["MyColumn"] 'MyColumnがnullの場合は失敗しますが、MyColumnが存在しない場合は失敗しません。 – Matthew

+1

@Matthewはい、私をその狂気から始めさせないでください。私は 'DBNull.Value'のファンではありません –

+0

私はあなたの' row.GetField'の例で行くと思います、ありがとう! – Matthew

1

あなたは動的に適切な一般的な方法を構築するためにリフレクションを使用することができます。

MyClass myClass = new MyClass(); 
var myType = typeof(MyClass.myDecimal); 
var myMethod = Type.GetType("System.Data.DataRowExtensions") 
    .GetMethod("Field", new[]{typeof(DataRow), typeof(string)); 
var genericMethod = myMethod.MakeGenericMethod(new[]{myType}); 

myClass.myDecimal = genericMethod.Invoke(row, new object[]{"MyDecimalColumnName"}); 
+0

私はおそらくその上に_could_をイタリック体にします。はい、動作しますが、間違いなく最適な解決策ではありません。 –

関連する問題