DoboWiki
Top
> .NETプログラミング研究/30 をテンプレートにして作成
.NETプログラミング研究/30 をテンプレートにして作成
開始行:
#title(.NETプログラミング研究 第30号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第30号 [#ra3e5c76]
**.NET Tips [#ref3ef95]
***型のメンバを動的に呼び出す [#j9b27717]
#column(注意){{
この記事の最新版は「[[型のメンバを動的に呼び出す>https://...
}}
ここでは、Typeオブジェクトで表された型のインスタンスの作...
まず、次のようなクラスが宣言されているものとします。
#code(vbnet){{
Namespace MyNamespace
Public Class [MyClass]
'フィールド
Private PrivateField As Integer
Public StringArray() As String
'プロパティ
Public Property PublicProperty() As Integer
Get
Return PrivateField
End Get
Set(ByVal Value As Integer)
PrivateField = Value
End Set
End Property
'インデクサ
Default Public Property Item(ByVal index As Integ...
Get
Return index.ToString()
End Get
Set(ByVal Value As String)
End Set
End Property
'コンストラクタ
Public Sub New(ByVal val As Integer)
PrivateField = val
StringArray = New String() {"1", "2", "3"}
End Sub
Public Sub New()
PrivateField = 0
StringArray = New String() {"1", "2", "3"}
End Sub
'メソッド
Public Overloads Function PublicMethod( _
ByVal num1 As Integer, ByVal num2 As Integer) As ...
Return (num1 - num2).ToString()
End Function
Public Overloads Function PublicMethod( _
ByVal num1 As Integer) As String
Return num1.ToString()
End Function
Public Overloads Function PublicMethod() As String
Return PublicMethod(0)
End Function
'静的メソッド
Public Overloads Shared Function StaticMethod( _
ByVal num1 As Integer, ByVal num2 As Integer) As ...
Return num1 + num2
End Function
Public Overloads Shared Function StaticMethod( _
ByVal num1 As Integer, ByVal num2 As Integer, _
ByRef num3 As Integer) As Integer
Dim sum As Integer = num1 + num2 + num3
num3 = num1 - num2 - num3
Return sum
End Function
End Class
End Namespace
}}
#code(csharp){{
namespace MyNamespace
{
public class MyClass
{
//フィールド
private int PrivateField;
public string[] StringArray;
//プロパティ
public int PublicProperty
{
get
{
return PrivateField;
}
set
{
PrivateField = value;
}
}
//インデクサ
public string this[int index]
{
get
{
return index.ToString();
}
set
{
}
}
//コンストラクタ
public MyClass(int val)
{
PrivateField = val;
StringArray = new string[] {"1", "2", "3"};
}
public MyClass()
{
PrivateField = 0;
StringArray = new string[] {"1", "2", "3"};
}
//メソッド
public string PublicMethod(int num1, int num2)
{
return (num1 - num2).ToString();
}
public string PublicMethod(int num1)
{
return num1.ToString();
}
public string PublicMethod()
{
return PublicMethod(0);
}
//静的メソッド
public static int StaticMethod(int num1, int num2)
{
return num1 + num2;
}
public static int StaticMethod(
int num1, int num2, ref int num3)
{
int sum = num1 + num2 + num3;
num3 = num1 - num2 - num3;
return sum;
}
}
}
}}
Typeオブジェクトのメンバを呼び出すには、InvokeMemberメソ...
次にInvokeMemberメソッドを用いて、MyClassクラスのメンバを...
#code(vbnet){{
'Imports System.Reflection
'が宣言されているものとする
Dim num As Integer
Dim str As String
'MyClassクラスのTypeオブジェクトを取得する
Dim t As Type = GetType(MyNamespace.MyClass)
'***** インスタンスの作成 *****
'MyClassのインスタンスを作成
'target = New MyNamespace.MyClass(100)
'と同等
Dim target As Object = t.InvokeMember(Nothing, _
BindingFlags.CreateInstance, _
Nothing, _
Nothing, _
New Object() {100})
'***** メソッドの実行 *****
'PublicMethodメソッドを実行
'str = target.PublicMethod(12)
'と同等
str = CStr(t.InvokeMember("PublicMethod", _
BindingFlags.InvokeMethod, _
Nothing, _
target, _
New Object() {12}))
'静的メソッドStaticMethodを実行
'num = MyNamespace.MyClass.StaticMethod(1, 2)
'と同等
num = CInt(t.InvokeMember("StaticMethod", _
BindingFlags.InvokeMethod, _
Nothing, _
Nothing, _
New Object() {1, 2}))
'refパラメータで返される値を取得
'num = MyNamespace.MyClass.StaticMethod(1, 2, 0)
'と同等
Dim objs() As Object = {1, 2, 0}
num = CInt(t.InvokeMember("StaticMethod", _
BindingFlags.InvokeMethod, _
Nothing, _
Nothing, _
objs))
'refパラメータで受け取った値を表示
Console.WriteLine(objs(2))
'パラメータの名前でパラメータを指定する
'str = target.PublicMethod(num2:=5, num1:=7)
'と同等
str = CStr(t.InvokeMember("PublicMethod", _
BindingFlags.InvokeMethod, _
Nothing, target, _
New Object() {5, 7}, _
Nothing, _
Nothing, _
New String() {"num2", "num1"}))
'***** プロパティの設定と取得 ****
'PublicPropertyプロパティを設定
'target.PublicProperty = 100
'と同等
t.InvokeMember("PublicProperty", _
BindingFlags.SetProperty, _
Nothing, _
target, _
New Object() {100})
'PublicPropertyプロパティを取得
'num = target.PublicProperty
'と同等
num = CInt(t.InvokeMember("PublicProperty", _
BindingFlags.GetProperty, _
Nothing, _
target, _
Nothing))
'インデクサの指定したインデックスの要素を設定
'target(1) = "two"
'と同等
t.InvokeMember("Item", _
BindingFlags.SetProperty, _
Nothing, _
target, _
New Object() {1, "two"})
'インデクサの指定したインデックスの要素を取得
'str = target(1)
'と同等
str = CStr(t.InvokeMember("Item", _
BindingFlags.GetProperty, _
Nothing, _
target, _
New Object() {1}))
'***** フィールドの設定と取得 *****
'PrivateFieldフィールドを設定
'target.PrivateField = 0
'と同等(ただし、通常プライベートフィールドにはアクセス不...
t.InvokeMember("PrivateField", _
BindingFlags.Public Or BindingFlags.NonPublic Or _
BindingFlags.Instance Or BindingFlags.SetField, _
Nothing, _
target, _
New Object() {0})
'PrivateFieldフィールドを取得
'num = target.PrivateField
'と同等(ただし、通常プライベートフィールドにはアクセス不...
num = CInt(t.InvokeMember("PrivateField", _
BindingFlags.Public Or BindingFlags.NonPublic Or _
BindingFlags.Instance Or BindingFlags.GetField, _
Nothing, _
target, _
Nothing))
'配列StringArrayフィールドの0番目の値を設定
'target.StringArray(0) = "ゼロ"
'と同等
t.InvokeMember("StringArray", _
BindingFlags.SetField, _
Nothing, _
target, _
New Object() {0, "ゼロ"})
'配列StringArrayフィールドの0番目の値を取得
'str = target.StringArray(0)
'と同等
str = CStr(t.InvokeMember("StringArray", _
BindingFlags.GetField, _
Nothing, _
target, _
New Object() {0}))
}}
#code(csharp){{
//using System.Reflection;
//が宣言されているものとする
int num;
string str;
//MyClassクラスのTypeオブジェクトを取得する
Type t = typeof(MyNamespace.MyClass);
//***** インスタンスの作成 *****
//MyClassのインスタンスを作成
//target = new MyNamespace.MyClass(100)
//と同等
object target = t.InvokeMember(null,
BindingFlags.CreateInstance,
null,
null,
new object[] {100});
//***** メソッドの実行 *****
//PublicMethodメソッドを実行
//str = target.PublicMethod(12)
//と同等
str = (string) t.InvokeMember("PublicMethod",
BindingFlags.InvokeMethod,
null,
target,
new object[] {12});
//静的メソッドStaticMethodを実行
//num = MyNamespace.MyClass.StaticMethod(1, 2)
//と同等
num = (int) t.InvokeMember("StaticMethod",
BindingFlags.InvokeMethod,
null,
null,
new object[] {1, 2});
//refパラメータで返される値を取得
//num = MyNamespace.MyClass.StaticMethod(1, 2, ref 0)
//と同等
object[] objs = new object[] {1, 2, 0};
num = (int) t.InvokeMember("StaticMethod",
BindingFlags.InvokeMethod,
null,
null,
objs);
//refパラメータで受け取った値を表示
Console.WriteLine(objs[2]);
//パラメータの名前でパラメータを指定する
//str = target.PublicMethod(num2:=5, num1:=7)
//と同等
str = (string) t.InvokeMember("PublicMethod",
BindingFlags.InvokeMethod, null, target,
new object[] {5, 7},
null,
null,
new string[] {"num2", "num1"});
//***** プロパティの設定と取得 ****
//PublicPropertyプロパティを設定
//target.PublicProperty = 100
//と同等
t.InvokeMember("PublicProperty",
BindingFlags.SetProperty,
null,
target,
new object[] {100});
//PublicPropertyプロパティを取得
//num = target.PublicProperty
//と同等
num = (int) t.InvokeMember("PublicProperty",
BindingFlags.GetProperty,
null,
target,
null);
//インデクサの指定したインデックスの要素を設定
//target[1] = "two"
//と同等
t.InvokeMember("Item",
BindingFlags.SetProperty,
null,
target,
new object[] {1, "two"});
//インデクサの指定したインデックスの要素を取得
//str = target[1]
//と同等
str = (string) t.InvokeMember("Item",
BindingFlags.GetProperty,
null,
target,
new object[] {1});
//***** フィールドの設定と取得 *****
//PrivateFieldフィールドを設定
//target.PrivateField = 0
//と同等(ただし、通常プライベートフィールドにはアクセス...
t.InvokeMember("PrivateField",
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetField,
null,
target,
new object[] {0});
//PrivateFieldフィールドを取得
//num = target.PrivateField
//と同等(ただし、通常プライベートフィールドにはアクセス...
num = (int) t.InvokeMember("PrivateField",
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.GetField,
null,
target,
null);
//配列StringArrayフィールドの0番目の値を設定
//target.StringArray[0] = "ゼロ"
//と同等
t.InvokeMember("StringArray",
BindingFlags.SetField,
null,
target,
new object[] {0, "ゼロ"});
//配列StringArrayフィールドの0番目の値を取得
//str = target.StringArray[0]
//と同等
str = (string) t.InvokeMember("StringArray",
BindingFlags.GetField,
null,
target,
new object[] {0});
}}
上記のようにType.InvokeMemberメソッドを使う以外に、Method...
次にこれらの方法を使った簡単な例を示します。
#code(vbnet){{
'Imports System.Reflection
'が宣言されているものとする
'MyClassクラスのTypeオブジェクトを取得する
Dim t As Type = GetType(MyNamespace.MyClass)
'***** インスタンスの作成 *****
Dim ci As ConstructorInfo = _
t.GetConstructor(New Type() {GetType(Integer)})
Dim target As Object = ci.Invoke(New Object() {5})
'***** メソッドの実行 *****
Dim mi As MethodInfo = t.GetMethod("PublicMethod", New Ty...
Dim str As String = CStr(mi.Invoke(target, New Object() {...
'***** プロパティの設定と取得 ****
Dim pi As PropertyInfo = t.GetProperty("PublicProperty")
pi.SetValue(target, 1, Nothing)
Dim num As Integer = CInt(pi.GetValue(target, Nothing))
'***** フィールドの設定と取得 ****
Dim fi As FieldInfo = t.GetField("PrivateField", _
BindingFlags.Public Or BindingFlags.NonPublic Or _
BindingFlags.Instance)
fi.SetValue(target, -1)
num = CInt(fi.GetValue(target))
}}
#code(csharp){{
//using System.Reflection;
//が宣言されているものとする
//MyClassクラスのTypeオブジェクトを取得する
Type t = typeof(MyNamespace.MyClass);
//***** インスタンスの作成 *****
ConstructorInfo ci = t.GetConstructor(new Type[] {typeof(...
object target = ci.Invoke(new object[] {5});
//***** メソッドの実行 *****
MethodInfo mi = t.GetMethod("PublicMethod", new Type[] {});
string str = (string) mi.Invoke(target, new object[] {});
//***** プロパティの設定と取得 ****
PropertyInfo pi = t.GetProperty("PublicProperty");
pi.SetValue(target, 1, null);
int num = (int) pi.GetValue(target, null);
//***** フィールドの設定と取得 ****
FieldInfo fi = t.GetField("PrivateField",
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance);
fi.SetValue(target, -1);
num = (int) fi.GetValue(target);
}}
さらにインスタンスの作成は、AppDomain.CreateInstanceメソ...
補足:
ここで紹介したように、コンパイル時に型が不明であるオブジ...
VB.NETの暗黙の遅延バインディングにより、メソッドやプロパ...
#code(vbnet){{
'Imports System.Reflection
'が宣言されているものとする
Dim num As Integer
Dim str As String
'MyClassクラスのTypeオブジェクトを取得する
Dim t As Type = GetType(MyNamespace.MyClass)
'MyClassのインスタンスを作成
Dim target As Object = t.InvokeMember(Nothing, _
BindingFlags.CreateInstance, _
Nothing, _
Nothing, _
New Object() {100})
'PublicMethodメソッドを実行
num = target.PublicMethod(12)
'***** プロパティの設定と取得 ****
'PublicPropertyプロパティを設定
target.PublicProperty = 100
'インデクサの指定したインデックスの要素を取得
str = target(1)
}}
**.NET質問箱 [#w1702ed0]
「.NET質問箱」では、「どぼん!のプログラミング掲示板」に...
-[[どぼん!のプログラミング掲示板>https://dobon.net/vb/bb...
***フォームに配置されているコントロールを名前で探すには?...
#column(注意){{
この記事の最新版は「[[フォームに配置されているコントロー...
}}
''【質問】''
フォームに配置されているコントロールをその名前(文字列)...
''【回答】''
Visual Studio .NETのフォームデザイナなどを使ってフォーム...
(*1)VB.NETでは、WithEventsが付いていると、フィールドの名...
フォームに配置されたコントロールを名前で探すメソッドの例...
#code(vbnet){{
''' <summary>
''' このフォームに配置されているコントロールを名前で探す
''' (フォームクラスのフィールドをフィールド名で探す)
''' </summary>
''' <param name="name">コントロール(フィールド)の名前</...
''' <returns>見つかった時は、コントロールのオブジェクト。
''' 見つからなかった時は、null(VB.NETではNothing)。</retu...
Public Function FindControlByFieldName(ByVal name As Stri...
'まずプロパティ名を探し、見つからなければフィールド名...
Dim t As System.Type = Me.GetType()
Dim pi As System.Reflection.PropertyInfo = _
t.GetProperty(name, _
System.Reflection.BindingFlags.Public Or _
System.Reflection.BindingFlags.NonPublic Or _
System.Reflection.BindingFlags.Instance Or _
System.Reflection.BindingFlags.DeclaredOnly)
If Not pi Is Nothing Then
Return pi.GetValue(Me, Nothing)
End If
Dim fi As System.Reflection.FieldInfo = _
t.GetField(name, _
System.Reflection.BindingFlags.Public Or _
System.Reflection.BindingFlags.NonPublic Or _
System.Reflection.BindingFlags.Instance Or _
System.Reflection.BindingFlags.DeclaredOnly)
If fi Is Nothing Then
Return Nothing
End If
Return fi.GetValue(Me)
End Function
}}
#code(csharp){{
/// <summary>
/// このフォームに配置されているコントロールを名前で探す
/// (フォームクラスのフィールドをフィールド名で探す)
/// </summary>
/// <param name="name">コントロール(フィールド)の名前</...
/// <returns>見つかった時は、コントロールのオブジェクト。
/// 見つからなかった時は、null(VB.NETではNothing)。</retu...
public object FindControlByFieldName(string name)
{
System.Type t = this.GetType();
System.Reflection.FieldInfo fi = t.GetField(
name,
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.DeclaredOnly);
if (fi == null)
return null;
return fi.GetValue(this);
}
}}
次に、"TextBox1"という名前のテキストボックスコントロール...
#code(vbnet){{
'"TextBox1"という名前のコントロールを探す
Dim tb As TextBox = CType(FindControlByFieldName("TextBox...
'"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text
}}
#code(csharp){{
//"TextBox1"という名前のコントロールを探す
TextBox tb = (TextBox) FindControlByFieldName("TextBox1");
//"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text;
}}
上記の方法で解決できると思いますが、別の方法として、コン...
#code(vbnet){{
''' <summary>
''' フォームに配置されているコントロールを名前で探す
''' </summary>
''' <param name="ctr">コントロールを探すフォーム</param>
''' <param name="name">コントロールの名前</param>
''' <returns>見つかった時は、コントロールのオブジェクト。
''' 見つからなかった時は、null(VB.NETではNothing)。</retu...
Public Function FindControlByName( _
ByVal ctr As System.Windows.Forms.Control, _
ByVal name As String) As System.Windows.Forms.Con...
If ctr.Name = name Then
Return ctr
End If
Dim c As System.Windows.Forms.Control
For Each c In ctr.Controls
Dim res As System.Windows.Forms.Control = _
FindControlByName(c, name)
If Not (res Is Nothing) Then
Return res
End If
Next c
Return Nothing
End Function
}}
#code(csharp){{
/// <summary>
/// フォームに配置されているコントロールを名前で探す
/// </summary>
/// <param name="ctr">コントロールを探すフォーム</param>
/// <param name="name">コントロールの名前</param>
/// <returns>見つかった時は、コントロールのオブジェクト。
/// 見つからなかった時は、null(VB.NETではNothing)。</retu...
public System.Windows.Forms.Control FindControlByName(
System.Windows.Forms.Control ctr, string name)
{
if (ctr.Name == name)
return ctr;
foreach (System.Windows.Forms.Control c in ctr.Contro...
{
System.Windows.Forms.Control res = FindControlByN...
if (res != null)
return res;
}
return null;
}
}}
使用例は、次のようになります。
#code(vbnet){{
'"TextBox1"という名前のコントロールを探す
Dim tb As TextBox = CType(FindControlByName(Me, "TextBox1...
'"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text
}}
#code(csharp){{
//"TextBox1"という名前のコントロールを探す
TextBox tb = (TextBox) FindControlByName(this, "TextBox1");
//"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text;
}}
このFindControlByNameメソッドは、コントロールの子コントロ...
○この記事の基になった掲示板のスレッド
-[[コントロール検索: 投稿者(敬称略) クリリン>https://dobo...
-[[コントロール配列: 投稿者(敬称略) どらごら、よねKEN...
***.NET Compact Frameworkで二重起動を禁止するには? [#ce1...
''【質問】''
DOBON.NETの「二重起動を禁止する」で紹介されている方法が、...
-[[DOBON.NET .NET Tips - 二重起動を禁止する>https://dobon...
''【回答】''
.NET Compact Frameworkのアプリケーションは、Pocket PCでは...
.NET Compact Frameworkで二重起動を禁止するサンプルがGotDo...
-[[GotDotNet User Sample: Ensure only one instance sample...
このサンプルでは、CreateMutex関数を使うことにより、二重起...
○この記事の基になった掲示板のスレッド
-[[プログラム二重起動のチェック: 投稿者(敬称略) crow001、...
**コメント [#x47c7794]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-04-06 (火) 06:00:00,DOB...
終了行:
#title(.NETプログラミング研究 第30号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第30号 [#ra3e5c76]
**.NET Tips [#ref3ef95]
***型のメンバを動的に呼び出す [#j9b27717]
#column(注意){{
この記事の最新版は「[[型のメンバを動的に呼び出す>https://...
}}
ここでは、Typeオブジェクトで表された型のインスタンスの作...
まず、次のようなクラスが宣言されているものとします。
#code(vbnet){{
Namespace MyNamespace
Public Class [MyClass]
'フィールド
Private PrivateField As Integer
Public StringArray() As String
'プロパティ
Public Property PublicProperty() As Integer
Get
Return PrivateField
End Get
Set(ByVal Value As Integer)
PrivateField = Value
End Set
End Property
'インデクサ
Default Public Property Item(ByVal index As Integ...
Get
Return index.ToString()
End Get
Set(ByVal Value As String)
End Set
End Property
'コンストラクタ
Public Sub New(ByVal val As Integer)
PrivateField = val
StringArray = New String() {"1", "2", "3"}
End Sub
Public Sub New()
PrivateField = 0
StringArray = New String() {"1", "2", "3"}
End Sub
'メソッド
Public Overloads Function PublicMethod( _
ByVal num1 As Integer, ByVal num2 As Integer) As ...
Return (num1 - num2).ToString()
End Function
Public Overloads Function PublicMethod( _
ByVal num1 As Integer) As String
Return num1.ToString()
End Function
Public Overloads Function PublicMethod() As String
Return PublicMethod(0)
End Function
'静的メソッド
Public Overloads Shared Function StaticMethod( _
ByVal num1 As Integer, ByVal num2 As Integer) As ...
Return num1 + num2
End Function
Public Overloads Shared Function StaticMethod( _
ByVal num1 As Integer, ByVal num2 As Integer, _
ByRef num3 As Integer) As Integer
Dim sum As Integer = num1 + num2 + num3
num3 = num1 - num2 - num3
Return sum
End Function
End Class
End Namespace
}}
#code(csharp){{
namespace MyNamespace
{
public class MyClass
{
//フィールド
private int PrivateField;
public string[] StringArray;
//プロパティ
public int PublicProperty
{
get
{
return PrivateField;
}
set
{
PrivateField = value;
}
}
//インデクサ
public string this[int index]
{
get
{
return index.ToString();
}
set
{
}
}
//コンストラクタ
public MyClass(int val)
{
PrivateField = val;
StringArray = new string[] {"1", "2", "3"};
}
public MyClass()
{
PrivateField = 0;
StringArray = new string[] {"1", "2", "3"};
}
//メソッド
public string PublicMethod(int num1, int num2)
{
return (num1 - num2).ToString();
}
public string PublicMethod(int num1)
{
return num1.ToString();
}
public string PublicMethod()
{
return PublicMethod(0);
}
//静的メソッド
public static int StaticMethod(int num1, int num2)
{
return num1 + num2;
}
public static int StaticMethod(
int num1, int num2, ref int num3)
{
int sum = num1 + num2 + num3;
num3 = num1 - num2 - num3;
return sum;
}
}
}
}}
Typeオブジェクトのメンバを呼び出すには、InvokeMemberメソ...
次にInvokeMemberメソッドを用いて、MyClassクラスのメンバを...
#code(vbnet){{
'Imports System.Reflection
'が宣言されているものとする
Dim num As Integer
Dim str As String
'MyClassクラスのTypeオブジェクトを取得する
Dim t As Type = GetType(MyNamespace.MyClass)
'***** インスタンスの作成 *****
'MyClassのインスタンスを作成
'target = New MyNamespace.MyClass(100)
'と同等
Dim target As Object = t.InvokeMember(Nothing, _
BindingFlags.CreateInstance, _
Nothing, _
Nothing, _
New Object() {100})
'***** メソッドの実行 *****
'PublicMethodメソッドを実行
'str = target.PublicMethod(12)
'と同等
str = CStr(t.InvokeMember("PublicMethod", _
BindingFlags.InvokeMethod, _
Nothing, _
target, _
New Object() {12}))
'静的メソッドStaticMethodを実行
'num = MyNamespace.MyClass.StaticMethod(1, 2)
'と同等
num = CInt(t.InvokeMember("StaticMethod", _
BindingFlags.InvokeMethod, _
Nothing, _
Nothing, _
New Object() {1, 2}))
'refパラメータで返される値を取得
'num = MyNamespace.MyClass.StaticMethod(1, 2, 0)
'と同等
Dim objs() As Object = {1, 2, 0}
num = CInt(t.InvokeMember("StaticMethod", _
BindingFlags.InvokeMethod, _
Nothing, _
Nothing, _
objs))
'refパラメータで受け取った値を表示
Console.WriteLine(objs(2))
'パラメータの名前でパラメータを指定する
'str = target.PublicMethod(num2:=5, num1:=7)
'と同等
str = CStr(t.InvokeMember("PublicMethod", _
BindingFlags.InvokeMethod, _
Nothing, target, _
New Object() {5, 7}, _
Nothing, _
Nothing, _
New String() {"num2", "num1"}))
'***** プロパティの設定と取得 ****
'PublicPropertyプロパティを設定
'target.PublicProperty = 100
'と同等
t.InvokeMember("PublicProperty", _
BindingFlags.SetProperty, _
Nothing, _
target, _
New Object() {100})
'PublicPropertyプロパティを取得
'num = target.PublicProperty
'と同等
num = CInt(t.InvokeMember("PublicProperty", _
BindingFlags.GetProperty, _
Nothing, _
target, _
Nothing))
'インデクサの指定したインデックスの要素を設定
'target(1) = "two"
'と同等
t.InvokeMember("Item", _
BindingFlags.SetProperty, _
Nothing, _
target, _
New Object() {1, "two"})
'インデクサの指定したインデックスの要素を取得
'str = target(1)
'と同等
str = CStr(t.InvokeMember("Item", _
BindingFlags.GetProperty, _
Nothing, _
target, _
New Object() {1}))
'***** フィールドの設定と取得 *****
'PrivateFieldフィールドを設定
'target.PrivateField = 0
'と同等(ただし、通常プライベートフィールドにはアクセス不...
t.InvokeMember("PrivateField", _
BindingFlags.Public Or BindingFlags.NonPublic Or _
BindingFlags.Instance Or BindingFlags.SetField, _
Nothing, _
target, _
New Object() {0})
'PrivateFieldフィールドを取得
'num = target.PrivateField
'と同等(ただし、通常プライベートフィールドにはアクセス不...
num = CInt(t.InvokeMember("PrivateField", _
BindingFlags.Public Or BindingFlags.NonPublic Or _
BindingFlags.Instance Or BindingFlags.GetField, _
Nothing, _
target, _
Nothing))
'配列StringArrayフィールドの0番目の値を設定
'target.StringArray(0) = "ゼロ"
'と同等
t.InvokeMember("StringArray", _
BindingFlags.SetField, _
Nothing, _
target, _
New Object() {0, "ゼロ"})
'配列StringArrayフィールドの0番目の値を取得
'str = target.StringArray(0)
'と同等
str = CStr(t.InvokeMember("StringArray", _
BindingFlags.GetField, _
Nothing, _
target, _
New Object() {0}))
}}
#code(csharp){{
//using System.Reflection;
//が宣言されているものとする
int num;
string str;
//MyClassクラスのTypeオブジェクトを取得する
Type t = typeof(MyNamespace.MyClass);
//***** インスタンスの作成 *****
//MyClassのインスタンスを作成
//target = new MyNamespace.MyClass(100)
//と同等
object target = t.InvokeMember(null,
BindingFlags.CreateInstance,
null,
null,
new object[] {100});
//***** メソッドの実行 *****
//PublicMethodメソッドを実行
//str = target.PublicMethod(12)
//と同等
str = (string) t.InvokeMember("PublicMethod",
BindingFlags.InvokeMethod,
null,
target,
new object[] {12});
//静的メソッドStaticMethodを実行
//num = MyNamespace.MyClass.StaticMethod(1, 2)
//と同等
num = (int) t.InvokeMember("StaticMethod",
BindingFlags.InvokeMethod,
null,
null,
new object[] {1, 2});
//refパラメータで返される値を取得
//num = MyNamespace.MyClass.StaticMethod(1, 2, ref 0)
//と同等
object[] objs = new object[] {1, 2, 0};
num = (int) t.InvokeMember("StaticMethod",
BindingFlags.InvokeMethod,
null,
null,
objs);
//refパラメータで受け取った値を表示
Console.WriteLine(objs[2]);
//パラメータの名前でパラメータを指定する
//str = target.PublicMethod(num2:=5, num1:=7)
//と同等
str = (string) t.InvokeMember("PublicMethod",
BindingFlags.InvokeMethod, null, target,
new object[] {5, 7},
null,
null,
new string[] {"num2", "num1"});
//***** プロパティの設定と取得 ****
//PublicPropertyプロパティを設定
//target.PublicProperty = 100
//と同等
t.InvokeMember("PublicProperty",
BindingFlags.SetProperty,
null,
target,
new object[] {100});
//PublicPropertyプロパティを取得
//num = target.PublicProperty
//と同等
num = (int) t.InvokeMember("PublicProperty",
BindingFlags.GetProperty,
null,
target,
null);
//インデクサの指定したインデックスの要素を設定
//target[1] = "two"
//と同等
t.InvokeMember("Item",
BindingFlags.SetProperty,
null,
target,
new object[] {1, "two"});
//インデクサの指定したインデックスの要素を取得
//str = target[1]
//と同等
str = (string) t.InvokeMember("Item",
BindingFlags.GetProperty,
null,
target,
new object[] {1});
//***** フィールドの設定と取得 *****
//PrivateFieldフィールドを設定
//target.PrivateField = 0
//と同等(ただし、通常プライベートフィールドにはアクセス...
t.InvokeMember("PrivateField",
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetField,
null,
target,
new object[] {0});
//PrivateFieldフィールドを取得
//num = target.PrivateField
//と同等(ただし、通常プライベートフィールドにはアクセス...
num = (int) t.InvokeMember("PrivateField",
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.GetField,
null,
target,
null);
//配列StringArrayフィールドの0番目の値を設定
//target.StringArray[0] = "ゼロ"
//と同等
t.InvokeMember("StringArray",
BindingFlags.SetField,
null,
target,
new object[] {0, "ゼロ"});
//配列StringArrayフィールドの0番目の値を取得
//str = target.StringArray[0]
//と同等
str = (string) t.InvokeMember("StringArray",
BindingFlags.GetField,
null,
target,
new object[] {0});
}}
上記のようにType.InvokeMemberメソッドを使う以外に、Method...
次にこれらの方法を使った簡単な例を示します。
#code(vbnet){{
'Imports System.Reflection
'が宣言されているものとする
'MyClassクラスのTypeオブジェクトを取得する
Dim t As Type = GetType(MyNamespace.MyClass)
'***** インスタンスの作成 *****
Dim ci As ConstructorInfo = _
t.GetConstructor(New Type() {GetType(Integer)})
Dim target As Object = ci.Invoke(New Object() {5})
'***** メソッドの実行 *****
Dim mi As MethodInfo = t.GetMethod("PublicMethod", New Ty...
Dim str As String = CStr(mi.Invoke(target, New Object() {...
'***** プロパティの設定と取得 ****
Dim pi As PropertyInfo = t.GetProperty("PublicProperty")
pi.SetValue(target, 1, Nothing)
Dim num As Integer = CInt(pi.GetValue(target, Nothing))
'***** フィールドの設定と取得 ****
Dim fi As FieldInfo = t.GetField("PrivateField", _
BindingFlags.Public Or BindingFlags.NonPublic Or _
BindingFlags.Instance)
fi.SetValue(target, -1)
num = CInt(fi.GetValue(target))
}}
#code(csharp){{
//using System.Reflection;
//が宣言されているものとする
//MyClassクラスのTypeオブジェクトを取得する
Type t = typeof(MyNamespace.MyClass);
//***** インスタンスの作成 *****
ConstructorInfo ci = t.GetConstructor(new Type[] {typeof(...
object target = ci.Invoke(new object[] {5});
//***** メソッドの実行 *****
MethodInfo mi = t.GetMethod("PublicMethod", new Type[] {});
string str = (string) mi.Invoke(target, new object[] {});
//***** プロパティの設定と取得 ****
PropertyInfo pi = t.GetProperty("PublicProperty");
pi.SetValue(target, 1, null);
int num = (int) pi.GetValue(target, null);
//***** フィールドの設定と取得 ****
FieldInfo fi = t.GetField("PrivateField",
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance);
fi.SetValue(target, -1);
num = (int) fi.GetValue(target);
}}
さらにインスタンスの作成は、AppDomain.CreateInstanceメソ...
補足:
ここで紹介したように、コンパイル時に型が不明であるオブジ...
VB.NETの暗黙の遅延バインディングにより、メソッドやプロパ...
#code(vbnet){{
'Imports System.Reflection
'が宣言されているものとする
Dim num As Integer
Dim str As String
'MyClassクラスのTypeオブジェクトを取得する
Dim t As Type = GetType(MyNamespace.MyClass)
'MyClassのインスタンスを作成
Dim target As Object = t.InvokeMember(Nothing, _
BindingFlags.CreateInstance, _
Nothing, _
Nothing, _
New Object() {100})
'PublicMethodメソッドを実行
num = target.PublicMethod(12)
'***** プロパティの設定と取得 ****
'PublicPropertyプロパティを設定
target.PublicProperty = 100
'インデクサの指定したインデックスの要素を取得
str = target(1)
}}
**.NET質問箱 [#w1702ed0]
「.NET質問箱」では、「どぼん!のプログラミング掲示板」に...
-[[どぼん!のプログラミング掲示板>https://dobon.net/vb/bb...
***フォームに配置されているコントロールを名前で探すには?...
#column(注意){{
この記事の最新版は「[[フォームに配置されているコントロー...
}}
''【質問】''
フォームに配置されているコントロールをその名前(文字列)...
''【回答】''
Visual Studio .NETのフォームデザイナなどを使ってフォーム...
(*1)VB.NETでは、WithEventsが付いていると、フィールドの名...
フォームに配置されたコントロールを名前で探すメソッドの例...
#code(vbnet){{
''' <summary>
''' このフォームに配置されているコントロールを名前で探す
''' (フォームクラスのフィールドをフィールド名で探す)
''' </summary>
''' <param name="name">コントロール(フィールド)の名前</...
''' <returns>見つかった時は、コントロールのオブジェクト。
''' 見つからなかった時は、null(VB.NETではNothing)。</retu...
Public Function FindControlByFieldName(ByVal name As Stri...
'まずプロパティ名を探し、見つからなければフィールド名...
Dim t As System.Type = Me.GetType()
Dim pi As System.Reflection.PropertyInfo = _
t.GetProperty(name, _
System.Reflection.BindingFlags.Public Or _
System.Reflection.BindingFlags.NonPublic Or _
System.Reflection.BindingFlags.Instance Or _
System.Reflection.BindingFlags.DeclaredOnly)
If Not pi Is Nothing Then
Return pi.GetValue(Me, Nothing)
End If
Dim fi As System.Reflection.FieldInfo = _
t.GetField(name, _
System.Reflection.BindingFlags.Public Or _
System.Reflection.BindingFlags.NonPublic Or _
System.Reflection.BindingFlags.Instance Or _
System.Reflection.BindingFlags.DeclaredOnly)
If fi Is Nothing Then
Return Nothing
End If
Return fi.GetValue(Me)
End Function
}}
#code(csharp){{
/// <summary>
/// このフォームに配置されているコントロールを名前で探す
/// (フォームクラスのフィールドをフィールド名で探す)
/// </summary>
/// <param name="name">コントロール(フィールド)の名前</...
/// <returns>見つかった時は、コントロールのオブジェクト。
/// 見つからなかった時は、null(VB.NETではNothing)。</retu...
public object FindControlByFieldName(string name)
{
System.Type t = this.GetType();
System.Reflection.FieldInfo fi = t.GetField(
name,
System.Reflection.BindingFlags.Public |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.DeclaredOnly);
if (fi == null)
return null;
return fi.GetValue(this);
}
}}
次に、"TextBox1"という名前のテキストボックスコントロール...
#code(vbnet){{
'"TextBox1"という名前のコントロールを探す
Dim tb As TextBox = CType(FindControlByFieldName("TextBox...
'"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text
}}
#code(csharp){{
//"TextBox1"という名前のコントロールを探す
TextBox tb = (TextBox) FindControlByFieldName("TextBox1");
//"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text;
}}
上記の方法で解決できると思いますが、別の方法として、コン...
#code(vbnet){{
''' <summary>
''' フォームに配置されているコントロールを名前で探す
''' </summary>
''' <param name="ctr">コントロールを探すフォーム</param>
''' <param name="name">コントロールの名前</param>
''' <returns>見つかった時は、コントロールのオブジェクト。
''' 見つからなかった時は、null(VB.NETではNothing)。</retu...
Public Function FindControlByName( _
ByVal ctr As System.Windows.Forms.Control, _
ByVal name As String) As System.Windows.Forms.Con...
If ctr.Name = name Then
Return ctr
End If
Dim c As System.Windows.Forms.Control
For Each c In ctr.Controls
Dim res As System.Windows.Forms.Control = _
FindControlByName(c, name)
If Not (res Is Nothing) Then
Return res
End If
Next c
Return Nothing
End Function
}}
#code(csharp){{
/// <summary>
/// フォームに配置されているコントロールを名前で探す
/// </summary>
/// <param name="ctr">コントロールを探すフォーム</param>
/// <param name="name">コントロールの名前</param>
/// <returns>見つかった時は、コントロールのオブジェクト。
/// 見つからなかった時は、null(VB.NETではNothing)。</retu...
public System.Windows.Forms.Control FindControlByName(
System.Windows.Forms.Control ctr, string name)
{
if (ctr.Name == name)
return ctr;
foreach (System.Windows.Forms.Control c in ctr.Contro...
{
System.Windows.Forms.Control res = FindControlByN...
if (res != null)
return res;
}
return null;
}
}}
使用例は、次のようになります。
#code(vbnet){{
'"TextBox1"という名前のコントロールを探す
Dim tb As TextBox = CType(FindControlByName(Me, "TextBox1...
'"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text
}}
#code(csharp){{
//"TextBox1"という名前のコントロールを探す
TextBox tb = (TextBox) FindControlByName(this, "TextBox1");
//"TextBox1"のTextの内容を変更する
tb.Text = "*" + tb.Text;
}}
このFindControlByNameメソッドは、コントロールの子コントロ...
○この記事の基になった掲示板のスレッド
-[[コントロール検索: 投稿者(敬称略) クリリン>https://dobo...
-[[コントロール配列: 投稿者(敬称略) どらごら、よねKEN...
***.NET Compact Frameworkで二重起動を禁止するには? [#ce1...
''【質問】''
DOBON.NETの「二重起動を禁止する」で紹介されている方法が、...
-[[DOBON.NET .NET Tips - 二重起動を禁止する>https://dobon...
''【回答】''
.NET Compact Frameworkのアプリケーションは、Pocket PCでは...
.NET Compact Frameworkで二重起動を禁止するサンプルがGotDo...
-[[GotDotNet User Sample: Ensure only one instance sample...
このサンプルでは、CreateMutex関数を使うことにより、二重起...
○この記事の基になった掲示板のスレッド
-[[プログラム二重起動のチェック: 投稿者(敬称略) crow001、...
**コメント [#x47c7794]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-04-06 (火) 06:00:00,DOB...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]