重複の可能性:
反射。それを使用して何を達成できますか?
C# でリフレクションを使用する例はたくさんありますが、C# で主に何に使用されているのか正確にはわかりません。では、いつ使うのですか?
重複の可能性:
反射。それを使用して何を達成できますか?
C# でリフレクションを使用する例はたくさんありますが、C# で主に何に使用されているのか正確にはわかりません。では、いつ使うのですか?
実際のケース:
名前空間の名前が渡されると、名前空間内のすべてのクラスを検索し、クラス内に関数「SelfTest」が見つかった場合はそれを呼び出し、必要に応じてオブジェクトをインスタンス化する関数。
これにより、テスト関数をオブジェクトの一部として宣言でき、テストのリストを維持することを心配する必要がなくなります。
一般に、タイプに触れるSystem.Type
ものはすべてリフレクションと見なすことができます。これは、あらゆる種類の設定上の規則のシナリオで (とりわけ) 役立つことがよくあります。
実行時までわからない型のインスタンスを作成する例を考えてみましょう:
public interface IVegetable {
public float PricePerKilo {get;set;}
}
public class Potato : IVegetable {
public float PricePerKilo {get;set;}
}
public class Tomato : IVegetable {
public float PricePerKilo {get;set;}
}
public static class Program {
public static void Main() {
//All we get here is a string representing the class
string className = "Tomato";
Type type = this.GetType().Assembly.GetType(className); //reflection method to get a type that's called "Tomato"
IVegetable veg = (IVegetable)Activator.CreateInstance(type);
}
}
使い方はたくさんあります。私がそれを使用する 1 つの方法は、(失敗テスト シナリオをシミュレートするために) 単体テストを失敗させるためにプライベート変数を破損する必要があるときの単体テストです。たとえば、データベース接続が失敗したことをモックしたい場合は、以下のメソッドを使用しconnectionString
て、DB で動作するクラスのプライベート変数を変更できます。これにより、DB に接続しようとすると DB 接続が失敗し、単体テストで適切な例外がスローされることを確認できます。
元:
/// <summary>
/// Uses reflection to set the field value in an object.
/// </summary>
///
/// <param name="type">The instance type.</param>
/// <param name="instance">The instance object.</param>
/// <param name="fieldName">The field's name which is to be fetched.</param>
/// <param name="fieldValue">The value to use when setting the field.</param>
internal static void SetInstanceField(Type type, object instance, string fieldName, object fieldValue)
{
BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
| BindingFlags.Static;
FieldInfo field = type.GetField(fieldName, bindFlags);
field.SetValue(instance, fieldValue);
}
Relection は、開発者が実行時にタイプ/インスタンスのメタデータにアクセスできるようにする手法です。
最も一般的な使用方法は、 CustomAttributeを定義し、実行時に使用することです。CustomAttribute は、ORM、ASP.Net ActionFilter、ユニット テスト フレームワークなどで使用されています。
Cory Charlton は、この質問に非常によく答えました。
クラス内のすべての文字列を調べて、Web ビューに送信する前にそれらを HTML セーフ文字列に変更するなど、検証/エンコードに使用します。同様に、ビューからデータを取得するときは、エンコーディング/正規表現を使用して、安全な html 文字のみが使用されていることを確認します。
もう 1 つの方法は、プラグインを C# で記述して、実行時に機能を認識させたい場合です。コード プロジェクトの例: http://www.codeproject.com/KB/cs/pluginsincsharp.aspx
たとえば、Microsoftがweb.configでそれをどのように使用しているかを参照してください:)
Autocompletebox から (ItemFilter プロパティを使用して) アイテムをフィルタリングする必要があるときに使用しました。ItemSource は Linq で設定されました。各項目は AnonymousType であったため、Reflection を使用してプロパティを取得し、必要なフィルターを実行しました。
Web アプリケーションの (まったく別のページから) ページ内のコントロールのリストをコンパイルするために使用しました。
クラスの動的インスタンス化、アセンブリの分析、型チェックなどに使用できます。
それは、プログラムが自分自身を見ることを可能にする反射です。