2017-05-08 4 views
0

すべてのタイプを処理するためにリフレクションを使用するにはどうすればよいですか?私はこのような多くのユーティリティ機能を実行するためにしようとしていた

public bool HasMember(object obj, string name) 
{ 
etc. 
} 

この特定の効用関数の名前と意味は関係ありません。

残念ながら、上記の関数は、構造体であるDateTimeやDecimalなどのすべての型を処理できません。整数やカスタムオブジェクトをうまく扱います。私は、C#は構造体とオブジェクトの両方を持ち、構造体はオブジェクトではないことを理解しています。しかし、どのように私のユーティリティメソッドですべての型を扱うことができますか?非常に多くのユーティリティ関数が必要であるため、オーバーロードされたメソッドはありません。

前の研究:

は、言語リファレンスが私にアドバイスを与えていない:https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/classes-and-structs/using-structs

また値型説明するテキストをなしヘルプ:どのようなタイプのC#の値でhttps://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/value-types

+1

は、「すべての種類を扱うことができません」 - なぜか?あなたが私に叫んだ稀な量のコードからすぐにはっきりと分かることはありません。 "これは' DateTime'では機能しません。問題を示す*完全なコードサンプルを投稿できますか? –

+0

今、私はそれを得る。構造体は、オブジェクトから継承するValueTypeというクラス(!)から継承します。[ここには参考のためにMSサイトへのリンクがあります](https://msdn.microsoft.com/en-us/library/system.valuetype(v = vs.110 ).aspx) – iltelko

+0

* "構造体はオブジェクトではありません" * *** C#の***はすべてオブジェクトです! –

答えて

2

すべてのタイプを処理できます。 objectは「ワイルドカード」のように機能します。ちょうどあなたのDateTimeを渡してください!

しかし、値の型を渡すとボクシングが発生します(構造体はDateTimeのようになります)。ボクシングは基本的に値型を参照型にラップしています。これは問題を引き起こす場合もありません。

あなたがボクシングをしたくない場合は、ジェネリック医薬品を検討:

public bool HasMember<T>(T obj, string name) 
{ 

} 
+0

ありがとう、これは私の混乱から私を助けました。答えとしてマーク。私はボクシングのように行動した理由はわかりませんが、私の質問の問題は、私は実際には非常によく、助けを借りて問題自体を理解していないということでした! – iltelko

2

を、 classまたはstructに関係なく、変数Objectに割り当てることができました。これらは有効な構文です:

object obj = new DateTime(); 
object obj2 = 100m; 

あなたのユーティリティメソッドは、署名を持っている場合は、

public bool HasMember(object obj, string name) 

を指定されているようですから、DateTimeDecimalのように、クラスや構造体の両方にそれを呼び出すことができます。

+0

私はそれをDecimalと呼んでいますか? (Nullable構造体)、オブジェクトは10進数に変換されます、なぜですか?それは私が構造体がオブジェクトではないと思った理由です。なぜそれはキャスティングですか? – iltelko

+0

decimalとDecimalは同義語です。あなたはおそらくボクシング/ unboxingについて読むべきです - https://docs.microsoft.com/en-us/dotnet/articles/csharp/programming-guide/types/boxing-and-unboxing – CodeFuller

+0

あなたは私がDecimal 、私はそれらが同じであるが、私は間違っていた。ありがとうございました。だからおそらくDecimal? (構造体とオブジェクト)はDecimalにキャストされませんか?私はまだNullable 何らかの理由で小数点にキャストする理由はありませんか?これはユーティリティ機能を呼び出す私の単体テストプロジェクトで発生し、オブジェクトはもはや同じではありません – iltelko

関連する問題