2012-02-23 12 views
5

コントロールのいくつかのプロパティを取得しています。ここで私は(タイプPropertyInfoのPINFO付き)プロパティを取得するために使用される方法です:うまく働いたが、今私は、オプションの値を持つプロパティに直面しています、と私はことを私に伝えるエラーメッセージが表示されますgetterがオプションの値を持つプロパティの値を反映して取得する

value = pinfo.GetValue(obj, nothing) 

パラメータの数が正しくありません。だから私はこの1つで私のコードを変更:

Dim index As Object() = {Nothing} 
value = pinfo.GetValue(obj, index) 

この時点で、私はすべてのエラーメッセージを取得できませんでしたが、このコードは良い値を取得しません。 Nothingをプロパティアクセサーによって提供されるデフォルト値で置き換えた場合にのみ機能します。

ただし、このデフォルト値は何かを事前に知ることはできません。そして、このコードは、の中にという機能があり、オプションの値を持たないプロパティを取得するので、特に1つのケースや別のコードを変更することはできません。

ReadOnly Property Foo(Optional ByVal Number As Integer = -1) As String 
    Get 
     If Number = -1 Then 
      Return "Your number is the default number: " & Number 
     Else 
      Return "Your number is " & Number 
     End If 
    End Get 
End Property 

:ここで問題に

をリードする場合の詳細精度が問題につながる財産の例である:私はEDIT


.NET 2.0に取り組んでいますこの種類のプロパティは、上記のコードのいずれも良い文字列を取得しません。

私の最高の推測では、一般的な目的のために最初のコードを試してみてください適切な例外をキャッチして、動的パラメータ(その場合の数)とそのタイプデフォルト値を取得するためになるようにIこのデフォルト値でgetValueを呼び出すことができます。

したがって、オプションのパラメータのデフォルト値を取得するにはどうすればよいですか?

答えて

3

これはオプションのパラメータで動作します:

ReadOnly Property Foo(Optional name As String = Nothing) As String 
    Get 
     If name Is Nothing Then 
      Return "Hello World" 
     Else 
      Return "Hello " & name 
     End If 
    End Get 
End Property 


Dim pinfo As Reflection.PropertyInfo = Me.GetType().GetProperty("Foo") 
Dim value As Object = pinfo.GetValue(Me, New Object() {"Tim"}) ' Hello Tim ' 
value = pinfo.GetValue(Me, New Object(){Nothing})    ' Hello World ' 

編集:動作しない整数あなたのコメントによると、私はまだオプションのデフォルト値を取得する方法がわかりませんのプロパティのパラメータ。あなたはそれを知っている場合、あなたは簡単にそれを渡すことができますが、そうでない場合は、次の(代わりに0のデフォルトとしてInt32.MinValueに注意してください)起こる:

ReadOnly Property Foo(Optional age As Int32 = Int32.MinValue) As String 
    Get 
     If age = Int32.MinValue Then 
      Return "I don't know how old i am" 
     Else 
      Return String.Format("I am {0} years old", age) 
     End If 
    End Get 
End Property 

Dim pinfo As Reflection.PropertyInfo = Me.GetType.GetProperty("Foo") 
Dim value As Object = pinfo.GetValue(Me, New Object() {38}) ' I am 38 years old ' 
value = pinfo.GetValue(Me, New Object() {Nothing})   ' I am 0 years old ' 
value = pinfo.GetValue(Me, New Object() {Int32.MinValue}) ' I don't know how old i am ' 

EDIT2:おかげで今@Rupする私はGetIndexParametersがあったことを知っています欠けている部分。したがって、以下はあらゆる種類のパラメータで動作するはずです。

Dim pinfo As Reflection.PropertyInfo = Me.GetType.GetProperty("Foo") 
Dim parameters() As Reflection.ParameterInfo = pinfo.GetIndexParameters() 
Dim params(parameters.Length - 1) As Object 
For i As Int32 = 0 To parameters.Length - 1 
    Dim paramInfo As Reflection.ParameterInfo = parameters(i) 
    If paramInfo.IsOptional Then 
     params(i) = paramInfo.DefaultValue 
    Else 
     If paramInfo.ParameterType.IsValueType Then 
      params(i) = Activator.CreateInstance(paramInfo.ParameterType) 
     Else 
      params(i) = Nothing 
     End If 
    End If 
Next 
Dim value As Object = pinfo.GetValue(Me, params) 
+0

こんにちは、答えはthxですが、あなたの構文は私のためには機能しません...コンパイラは中括弧(.NET 2.0)が好きではありません。私の関数はオブジェクトインスタンスのすべてのプロパティを取得しなければならず、多くの異なるオブジェクトに対して呼び出されます。 – GianT971

+0

そして、あなたが書いた最後の行は私の試行の1つと似ています私の質問に2番目のブロックコード) – GianT971

+0

@ GianT971:申し訳ありませんが、.NET 2を使用しています。 –

1

次の例を試してください。オブジェクトがnullであることを確認し、Activatorを使用してオブジェクトをアクティブにします。 以下のプログラムはC#にあります。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test testObj = null; 
     testObj = testObj ?? Activator.CreateInstance<Test>(); 
     var ty = testObj.GetType().GetProperty("MyProperty").GetValue(testObj, null); 

    } 
} 
public class Test 
{ 
    public Test2 MyProperty { get; set; } 
} 
public class Test2 
{ 
    public int Prty { get; set; } 
} 
+0

あなたの答えをありがとう、しかしアクティベーターはtestObjがnullになることはありません場合は、予想通り、それは動作するはず – GianT971

+0

を使用することはないだろうように、オブジェクトがnull等しいことはありませんので、それは、私が必要なものと適合しません。アクティベータは、値がnullでないことを確認するための追加のチェックに過ぎません。 – Manas

関連する問題