Type、MethodInfo、アクティベーション、カスタム属性
Typeオブジェクトを取得し、MethodInfoを検索し、メソッドを呼び出し、Activatorでインスタンスを作成し、カスタム属性を定義・読み取ります。
「Type、MethodInfo、アクティベーション、カスタム属性」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
概要
目標: リフレクションを安全に使います。
- Typeを取得します
- MethodInfoを探します
- Activatorで作成します
- 属性を定義して読み取ります
Typeの取得
typeof、インスタンスのGetType()、またはType.GetTypeで名前を指定してTypeを取得します。
using System;
public class Sample { }
public class Program
{
public static void Main(string[] args)
{
// 1) From a compile-time type
Type t1 = typeof(Sample);
// 2) From an instance
Sample s = new Sample();
Type t2 = s.GetType();
// 3) From a full name (needs assembly-qualified name for external types)
Type t3 = Type.GetType("System.String");
Console.WriteLine(t1.Name + ", " + t2.FullName + ", " + (t3 == null ? "null" : t3.Name));
}
}
MethodInfo.Invoke
GetMethodでメソッドを探し、Invokeで呼び出します。インスタンスと引数配列を渡します。
using System;
using System.Reflection;
public class Greeter
{
public string Hello(string name) { return "Hello, " + name; }
}
public class Program
{
public static void Main(string[] args)
{
Greeter g = new Greeter();
Type t = typeof(Greeter);
MethodInfo mi = t.GetMethod("Hello"); // public instance method
object result = mi.Invoke(g, new object[] { "Ada" }); // call dynamically
Console.WriteLine(result); // Hello, Ada
}
}
Activatorの基礎
Activator.CreateInstance(Type) は、public な引数なしコンストラクターを使用してオブジェクトを構築します。
using System;
public class Person
{
public string Name { get; set; }
public Person() { Name = "Unknown"; } // parameterless ctor
}
public class Program
{
public static void Main(string[] args)
{
Type tp = typeof(Person);
object o = Activator.CreateInstance(tp); // uses public parameterless ctor
Person p = (Person)o;
p.Name = "Alan";
Console.WriteLine("Created: " + p.Name);
}
}
カスタム属性
小さな Attribute クラスを作成し、型またはメソッドに対して GetCustomAttributes を呼び出して取得します。
using System;
using System.Reflection;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class LabelAttribute : Attribute
{
public string Text { get; private set; }
public LabelAttribute(string text) { Text = text; }
}
[Label("Utility class")]
public class Utils
{
[Label("Adds two ints")]
public static int Add(int a, int b) { return a + b; }
}
public class Program
{
public static void Main(string[] args)
{
Type t = typeof(Utils);
// Read class attribute
object[] classAttrs = t.GetCustomAttributes(typeof(LabelAttribute), false);
if (classAttrs.Length > 0)
Console.WriteLine("Class label: " + ((LabelAttribute)classAttrs[0]).Text);
// Read method attribute
MethodInfo mi = t.GetMethod("Add");
object[] methodAttrs = mi.GetCustomAttributes(typeof(LabelAttribute), false);
if (methodAttrs.Length > 0)
Console.WriteLine("Method label: " + ((LabelAttribute)methodAttrs[0]).Text);
}
}
ヒントと安全上の注意
ヒント:
- Type.GetType から返される null と、見つからないメンバーを確認します。
- 可能な場合は typeof を優先します(高速で安全です)。
- リフレクションの使用箇所を集約し、十分にドキュメント化します。
- 非公開メンバーや静的メンバーを検索するには BindingFlags を使用します。
インスタンス生成の基礎
まとめ
まとめ: Type を取得し、MethodInfo を検索し、Activator でインスタンスを作成し、GetCustomAttributes を使用して属性を読み取ります。
よくある質問
「Type、MethodInfo、アクティベーション、カスタム属性」レッスンは無料ですか?
はい。「Type、MethodInfo、アクティベーション、カスタム属性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「Type、MethodInfo、アクティベーション、カスタム属性」で何を学びますか?
Typeオブジェクトを取得し、MethodInfoを検索し、メソッドを呼び出し、Activatorでインスタンスを作成し、カスタム属性を定義・読み取ります。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「Type、MethodInfo、アクティベーション、カスタム属性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Type、MethodInfo、アクティベーション、カスタム属性
- ソースレベルの情報(Caller属性)
- 軽量なメタプログラミングのシナリオ