atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
プログラミング図書館・本館
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
プログラミング図書館・本館
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
プログラミング図書館・本館
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • プログラミング図書館・本館
  • CS
  • リフレクション

リフレクション

最終更新:2011年02月21日 00:16

atachi

- view
管理者のみ編集可
  • 型情報の取得 [#d47d1f87]
    • 文字列で任意のクラスの型情報を取得
  • 型情報の使い方
    • 型情報を使ってインスタンスを作成 [#x27b8e68]
    • 型情報からの配列型作成 [#b4058749]
    • 配列を初期化 [#h93d524f]
    • 型情報による操作 [#dbce2237]
  • ジェネリクスとリフレクション

型情報の取得

System::Typeクラス に型情報に関するアクセスができます。

Typeクラスの作成は次のように行います。

Type t = Type.GetType("MyClass"); // クラス名による取得

文字列で任意のクラスの型情報を取得

アプリケーションがアクセス可能な型情報の一覧を作成できるので、その中から取得したい型名を探し出す事で、 文字列から型情報を取得できる。

using System.Reflection;
 
class ObjectUtil{
 
	public static System.Type GetTypeFromName(string name)
	{
		foreach(System.Type type in GetCurrendDomainAssemblyTypes())
		{
			if (String.Equals(type.FullName, name) || String.Equals(type.AssemblyQualifiedName, name))
				return type;
		}
 
	}
 
	public static IList<System.Type> GetCurrendDomainAssemblyTypes()
	{
		Assembly[] assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
		List<System.Type> types = new List<System.Type>();
		foreach (System.Reflection.Assembly assembly in assemblies)
		{
			types.AddRange(assembly.GetTypes());
		}
		return types;
	}
}

上記のようなクラスを用意しておけば、完全なクラス名を与えることでそのクラスの型情報を取得できる。

Type type = GetTypeFromName("System.String");

型情報の使い方

型情報を使ってインスタンスを作成

Activatorを使う方法が最も簡単。
ただし、対象のクラス宣言でデフォルトコンストラクタにアクセスできる場合に限られる。

引数を伴うコンストラクタを呼び出したりするには、コンストラクタ情報(ConstructorInfo)を取得して呼び出す必要がある。

System.Type type = typeof(String);
object instance = Activator.CreateInstance(type);

型情報からの配列型作成

System.Type type = typeof(String);
object instance = Activator.CreateInstance(type);

このように作り出した場合のinstance変数はString型であることが型推論によりわかるため、問題はありません。

しかし、型情報から動的に配列型を作成するには、工夫が必要で必ず配列のサイズをコンストラクタを使って指定します。

System.Type type = typeof(String);
System.Type typeStrings = type.MakeArrayType(); // String[]のような型。
 
// 配列型をインスタンス化
//     - コンストラクタを取得する
ConstructorInfo[] Constructors = t.GetConstructors();
//     - コンストラクタをInvokeする。
//       パラメータは1つで、作成したい配列のサイズが入る。
var instance = Constructors[0].Invoke(new object[]{1}); // "new String[1]" と同じ

配列を初期化

上記のように動的に作成した配列型に初期値を与えることはできません。
よって、作成したインスタンスにArray.Copyを使って要素をコピーします。

Array.Copy(new String[]{"埼玉"}, (System.Array)instance, 1);
 
foreach(object element in (System.Array)instance)
{
	System.Console.WriteLine(element.ToString()); // echo "埼玉"
}

型情報による操作

Type t = Type.GetType("MyClass"); // クラス名による取得
 
// 型情報からインスタンスの生成
MyClass obj = Activator.CreateInstance(t);
 
t.GetField("width").SetValue(obj, 19); // objインスタンスのwidthフィールドへ値を設定
 
int width = (int)t.GetField("width").GetValue(obj); // objインスタンスのwidthフィールドの取得

ジェネリクスとリフレクション

ジェネリックの型情報をリフレクションで取得します。

class Program
{
	static void Main(string[] args)
	{
		Collection<Student> students = new Collection<Student>();
 
		Type clazz = students.GetType();
		Console.WriteLine("ジェネリクスであるか : " + clazz.IsGenericType);
 
		Type genClazz = clazz.GetGenericArguments()[0];
		Console.WriteLine("ジェネリック型 : " + genClazz.Name);
	}
}
 
 
class Student
{
	public string name;
}
「リフレクション」をウィキ内検索
LINE
シェア
Tweet

[Amazon商品]


プログラミング図書館・本館
記事メニュー

C#

  • 新機能
  • 言語文法
    • 型
    • 関数
    • クラス
    • 演算子
    • 構文
    • デリゲート
    • イベント
    • 例外処理
    • アトリビュート
    • 名前空間
    • ジェネリクス
  • リフレクション
  • LINQ

.NET Frameworks

  • 数値
  • 文字列
  • 日付時刻
  • オブジェクト
  • コレクション
  • ファイルシステム
  • スレッド
  • データテーブル
  • グラフィックス
  • デバッグ
    • ログ出力
    • ユニットテスト
  • ユーティリティ
  • ネットワーク
    • HTTP
  • デバイス
    • COMポート
  • EntityFrameworks
    • Code First Programming Model
  • デバイスドライバ
    • WinUSB

WPF

  • XAML
  • イベント
  • コマンド
  • スタイル
  • データバインディング
  • コンポーネント
  • グラフィックス
  • カスタムコンポーネント
    • 依存関係プロパティ

アプリケーション

  • 二重起動の防止
  • アンマネージドDLLの読み込み
  • 外部のアプリケーションを起動

VisualStudio

  • 拡張機能
  • カラー設定

ライブラリ

  • WPFToolkit
  • A Fast CSV Reader
  • AvalonDock

実装方法

  • ドラッグアンドドロップ
  • アプリケーション内のドラッグアンドドロップ
  • CSVからDataTable

minecraft

  • Bukkit
  • プラグイン
    • Permissions
    • SlowHealth
    • CookieMonster
    • iConomy
    • WorldGuard
    • Lockette
    • MyHome
    • BorderGuard

サイトについて

プロフィール/リンク/未分類

メモ/ゲーム/Stacks/Omoikane


更新履歴

取得中です。

ここを編集

記事メニュー2

読んでいる本


Effective C#

QLOOKアクセス解析

ここを編集

人気記事ランキング
  1. VisualStudio/拡張機能
もっと見る
最近更新されたページ
  • 5037日前

    Bukkit
  • 5044日前

    トップページ
  • 5065日前

    メニュー
  • 5075日前

    WPF/グラフィックス
  • 5075日前

    .NET/グラフィックス
  • 5075日前

    .NET/グラフィックス/画像の書き込み
  • 5075日前

    .NET/グラフィックス/画像の読み込み
  • 5081日前

    .NET/コレクション
  • 5099日前

    .NET/WinUSB
  • 5133日前

    BorderGuardプラグイン
もっと見る
人気記事ランキング
  1. VisualStudio/拡張機能
もっと見る
最近更新されたページ
  • 5037日前

    Bukkit
  • 5044日前

    トップページ
  • 5065日前

    メニュー
  • 5075日前

    WPF/グラフィックス
  • 5075日前

    .NET/グラフィックス
  • 5075日前

    .NET/グラフィックス/画像の書き込み
  • 5075日前

    .NET/グラフィックス/画像の読み込み
  • 5081日前

    .NET/コレクション
  • 5099日前

    .NET/WinUSB
  • 5133日前

    BorderGuardプラグイン
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  2. MadTown GTA (Beta) まとめウィキ
  3. R.E.P.O. 日本語解説Wiki
  4. シュガードール情報まとめウィキ
  5. ソードランページ @ 非公式wiki
  6. ヒカマーWiki
  7. AviUtl2のWiki
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. Dark War Survival攻略
  10. 星飼いの詩@ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 検索してはいけない言葉 @ ウィキ
  5. 初音ミク Wiki
  6. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. 発車メロディーwiki
  9. オレカバトル アプリ版 @ ウィキ
  10. 英傑大戦wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. べりはぴ - ストグラ まとめ @ウィキ
  3. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  4. クロスボーン・ガンダムX1改 - 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  5. 鬼レンチャン(レベル順) - 鬼レンチャンWiki
  6. ヴォイドカンパニー - アニヲタWiki(仮)
  7. 機体一覧 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  8. ガンダム・エアリアル(改修型) - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  9. コメント/雑談・質問 - マージマンション@wiki
  10. 危険度7 - 検索してはいけない言葉 @ ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.