2009-04-16 32 views
14

以前のプロジェクトのさまざまな場所でこのコードを含むCopyメソッドを使用していました(同じ名前のプロパティを持ちますが、基本クラスを実装するか、共通のインタフェースを実装する)。仕事のPropertyInfoインスタンスのSetValueエラー "オブジェクトがターゲットタイプと一致しません" c#

新しい場所、新しいコードベース - 今それはして値の代入に失敗していても非常に単純な例の「オブジェクトは、ターゲット・タイプと一致していません」...そして、それは....先週

public static void Copy(object fromObj, object toObj) 
    { 
     Type fromObjectType = fromObj.GetType(); 
     Type toObjectType = toObj.GetType(); 

     foreach (System.Reflection.PropertyInfo fromProperty in 
      fromObjectType.GetProperties()) 
     { 
      if (fromProperty.CanRead) 
      { 
       string propertyName = fromProperty.Name; 
       Type propertyType = fromProperty.PropertyType; 

       System.Reflection.PropertyInfo toProperty = 
        toObjectType.GetProperty(propertyName); 

       Type toPropertyType = toProperty.PropertyType; 

       if (toProperty != null && toProperty.CanWrite) 
       { 
        object fromValue = fromProperty.GetValue(fromObj,null); 
        toProperty.SetValue(toProperty,fromValue,null); 
       } 
      } 
     } 
    } 

    private class test 
    { 
     private int val; 
     private string desc; 

     public int Val { get { return val; } set { val = value; } } 

     public string Desc { get { return desc; } set { desc = value; } } 

    } 

    private void TestIt() 
    { 
     test testo = new test(); 
     testo.Val = 2; 
     testo.Desc = "TWO"; 

     test g = new test(); 

     Copy(testo,g); 

    } 
を働きました

うまくいけば、誰かが私がどこに嫌われているのかを指摘できますか?

答えて

17

試してみてください。

toProperty.SetValue(toObj,fromValue,null); 

あなたが代わりにtoObjの、ターゲットオブジェクトとしてプロパティ(toProperty)に合格しようとしています。あなたがこれをたくさんしている場合は、HyperDescriptorと考えると、反射コストを大幅に削減できます。

+0

D'ああする必要があります!それは私が最後に書き留めたバグです。この時間をチェックするのを忘れました... – kpollock

10

toProperty.SetValue(toObj,fromValue,null); 
+4

あまりにも遅いと思います。 –

関連する問題