既定のメンバーへのアクセス
すべての型が、既定のメンバーを持つことができます。既定のメンバーは、メンバー名を指定しなかったときに呼び出されるメンバーです。 Type.InvokeMember メソッドを呼び出すときにメンバー名に String.Empty ("") を指定すると、既定のメンバーを呼び出すことができます。 InvokeMember は、その型から System.Reflection.DefaultMemberAttribute 属性を取得した後、既定のメンバーを呼び出します。 Class1 の既定のメンバーを呼び出し、既定のメンバーによって返された値を o に代入する例を次に示します。
Dim c As New Class1()
Dim o As Object
o = c.GetType().InvokeMember("", BindingFlags.InvokeMethod, Nothing, c, New Object(){})
Console.WriteLine("Default member result: {0}", o)
Class1 c = new Class1();
object o;
o = c.GetType().InvokeMember("", BindingFlags.InvokeMethod, null, c, new object[0]);
Console.WriteLine("Default member result: {0}", o);
Class1^ c = gcnew Class1();
Object^ o;
o = c->GetType()->InvokeMember("", BindingFlags::InvokeMethod, nullptr, c, gcnew array<Object^>(0));
Console::WriteLine("Default member result: {0}", o);
既定のメンバーは宣言型の DefaultMemberAttribute 属性によって示されます。 次の例に示すクラスでは、DefaultMemberAttribute を手動で追加しています。 クラスでインデクサーを宣言している場合は DefaultMemberAttribute を手動で追加しないでください。その場合、属性はコンパイラによって自動的に追加されます。
<DefaultMember("GetIVal")> _
Public Class Class1
Private ival As Integer
Private sval As String
Public Sub New()
ival = 5050
sval = "6040"
End Sub
Public Function GetIVal() As Integer
Return ival
End Function
Public Function GetSVal() As String
Return sval
End Function
End Class
[DefaultMember("GetIVal")]
public class Class1
{
private int ival;
private string sval;
public Class1()
{
ival = 5050;
sval = "6040";
}
public int GetIVal()
{
return ival;
}
public string GetSVal()
{
return sval;
}
}
[DefaultMember("GetIVal")]
public ref class Class1
{
private:
int ival;
String^ sval;
public:
Class1()
{
ival = 5050;
sval = "6040";
}
int GetIVal()
{
return ival;
}
String^ GetSVal()
{
return sval;
}
};
既定のメンバーのカスタム属性を取得して既定のメンバーを取得する方法を次の例で示します。
Dim classType As Type = GetType(Class1)
Dim attribType As Type = GetType(DefaultMemberAttribute)
Dim defMem As DefaultMemberAttribute = _
CType(Attribute.GetCustomAttribute(CType(classType, MemberInfo), attribType), _
DefaultMemberAttribute)
Dim memInfo() As MemberInfo = classType.GetMember(defMem.MemberName)
Type classType = typeof(Class1);
Type attribType = typeof(DefaultMemberAttribute);
DefaultMemberAttribute defMem =
(DefaultMemberAttribute)Attribute.GetCustomAttribute((MemberInfo)classType, attribType);
MemberInfo[] memInfo = classType.GetMember(defMem.MemberName);
Type^ classType = Class1::typeid;
Type^ attribType = DefaultMemberAttribute::typeid;
DefaultMemberAttribute^ defMem =
(DefaultMemberAttribute^)Attribute::GetCustomAttribute((MemberInfo^)classType, attribType);
array<MemberInfo^>^ memInfo = classType->GetMember(defMem->MemberName);
同じ結果を生成する Type.GetDefaultMembers メソッドを使用する方が簡単な場合もあります。 ただし、型に既定のメンバーが複数定義されている場合、GetDefaultMembers は InvalidOperationException をスローします。 GetDefaultMembers の構文を次の例に示します。
Dim t As Type = GetType(Class1)
Dim memInfo() As MemberInfo = t.GetDefaultMembers()
Type t = typeof(Class1);
MemberInfo[] memInfo = t.GetDefaultMembers();
Type^ t = Class1::typeid;
array<MemberInfo^>^ memInfo = t->GetDefaultMembers();
GetCustomAttributes メソッドを使用して、型のカスタム属性を取得し、DefaultMemberAttribute を選択することもできます。 この方法を次の例に示します。
Dim t As Type = GetType(Class1)
Dim customAttribs() As Object _
= t.GetCustomAttributes(GetType(DefaultMemberAttribute), False)
If customAttribs.Length > 0 Then
Dim defMem As DefaultMemberAttribute = CType(customAttribs(0), DefaultMemberAttribute)
Dim memInfo() As MemberInfo = t.GetMember(defMem.MemberName)
If memInfo.Length > 0 Then
Console.WriteLine("Default Member: {0}", memInfo(0).Name)
End If
End If
Type t = typeof(Class1);
object[] customAttribs = t.GetCustomAttributes(typeof(DefaultMemberAttribute), false);
if (customAttribs.Length > 0)
{
DefaultMemberAttribute defMem = (DefaultMemberAttribute)customAttribs[0];
MemberInfo[] memInfo = t.GetMember(defMem.MemberName);
if (memInfo.Length > 0)
{
Console.WriteLine("Default Member: {0}", memInfo[0].Name);
}
}
Type^ t = Class1::typeid;
array<Object^>^ customAttribs = t->GetCustomAttributes(DefaultMemberAttribute::typeid, false);
if (customAttribs->Length > 0)
{
DefaultMemberAttribute^ defMem = (DefaultMemberAttribute^)customAttribs[0];
array<MemberInfo^>^ memInfo = t->GetMember(defMem->MemberName);
if (memInfo->Length > 0)
{
Console::WriteLine("Default Member: {0}", memInfo[0]->Name);
}
}