私は自分の仕事で使用するいくつかの便利なことを自分自身で共有したいと思っています。 これは記事の最初の部分であり、いくつかの記事を書く予定で、一貫したテーマを開発します。 私はすぐに、完璧なコードを持っているふりをしていないことに注意したいのですが、あなたのコメントで、私のツールをさらに生産的で便利なものにしたいと思っています。
最初の記事は入門書であり、リフレクションメカニズムの便利な拡張メソッドをいくつか定義したいと思います。 これらの方法は、今後ツールを作成するときに役立ちます。 この記事はほとんどのプログラマーにとって役に立たない可能性があるため、その人気を期待していません。 しかし、それでも、彼女についてはコメントが生じると思います。
ご存じのとおり、.netにはリフレクションメカニズム(リフレクション)があり、実行時にクラスに関する情報を取得できます。 何を、どのように、そしてなぜ描くのではありません。 要点:リフレクションには、FieldInfo、ProppertyInfo、および統一(ベース)クラスMemberInfoのいくつかの同じタイプのクラスがあります。 フィールドとプロパティの属性を一度にプログラムする場合、処理のためにフィールドとプロパティを順番に選択するか、MemberInfoを使用してすべてを一度に取得できます。 私は後者のオプションに決めましたが、明らかな理由で、このクラスは他のクラスと比較して少しトリミングされています。 たとえば、SetValueメソッドとGetValueメソッドがありません。フィールドとプロパティの型をすぐに取得したいと思います。 この点で、私は次の解決策を提案します。
名前空間Xaoc.BasicClasses
{
パブリックスタティッククラスReflectionUtil
{
public static void SetValue(このMemberInfo p_member、オブジェクトobj、オブジェクト値)
{
if(p_member == null || obj == null)
新しい例外をスロー(「無効なパラメーター」);
スイッチ(p_member.MemberType)
{
case MemberTypes.Field:
(FieldInfoとしてのp_member).SetValue(obj、value);
休憩;
case MemberTypes.Property:
if((p_member as PropertyInfo).CanWrite)
(PropertyInfoとしてのp_member).SetValue(obj、value、null);
他に
新しい例外をスロー(「プロパティを変更できません」);
休憩;
デフォルト:
新しい例外(「互換性のないMemberTypes」)をスローします。
}
}
パブリック静的オブジェクトGetValue(このMemberInfo p_member、オブジェクトobj)
{
if(p_member == null || obj == null)
新しい例外をスロー(「無効なパラメーター」);
オブジェクトの結果= null;
スイッチ(p_member.MemberType)
{
case MemberTypes.Field:
result =(FieldInfoとしてのp_member).GetValue(obj);
休憩;
case MemberTypes.Property:
if((p_member as PropertyInfo).CanRead)
result =(PropertyInfoとしてのp_member).GetValue(obj、null);
他に
新しい例外をスロー(「プロパティ値を取得できません」);
休憩;
デフォルト:
新しい例外(「互換性のないMemberTypes」)をスローします。
}
結果を返す;
}
public static Type GetMemberType(このMemberInfo p_member)
{
if(p_member == null)
新しい例外をスロー(「無効なパラメーター」);
type result = null;
スイッチ(p_member.MemberType)
{
case MemberTypes.Field:
result =(FieldInfoとしてのp_member).FieldType;
休憩;
case MemberTypes.Property:
result =(PropertyInfoとしてのp_member).PropertyType;
休憩;
デフォルト:
新しい例外(「互換性のないMemberTypes」)をスローします。
}
結果を返す;
}
}
}
これらのメソッドにより、MemberInfoはフィールドとプロパティの値を設定し、これらの値を取得し、型を認識することができます。 フィールドまたはプロパティに値を設定しようとすると、例外がスローされます。