2012-07-04 60 views
0

我有一個很大的(字符串,對象)字典。字典中的值是不同的類型。只有在運行時,我才能在(字符串,整數)或(字符串,字符串)字典中找到值的確切類型。在運行時,我必須將字典中的值分配給它們對應的強類型對象。這是簡化的問題。 我正在嘗試使用一個類型化的類來完成演員。 我有這個代碼不工作:如何使用反射和輸出參數進行通用投射

static void Main(string[] args) 
{ 
    var values = new Dictionary<string, object> 
    { 
     { "123", "test"}, 
     {"12", 123} 
    }; 
    var result = new Dictionary<string, object>(); 

    Type dict = values.GetType(); 
    Type typedCast = typeof(TypedClass<>).MakeGenericType(new [] { dict }); 
    MethodInfo method = typedCast.GetMethod("GetTypedValue", 
     BindingFlags.Static | BindingFlags.Public, 
     null, 
     new[] 
      { 
        typeof(object), 
        typeof(object).MakeByRefType() 
      }, 
     null); 

    method.Invoke(null, new[]{values, result}); 
} 

public class TypedClass<T> 
{ 
    public static void GetTypedValue(object value, out object obj) 
    { 
     obj = (T)Convert.ChangeType(value, typeof(T)); 
    } 
} 

裏面的GetTypedValue方法我看到正確的類型obj的值,但是這種方法之外out變量沒有值。請讓我知道我做錯了什麼。

+0

是您意圖是給定一個由Dictionary和String值組合的'Dictionary '來生成兩個字典,一個字符串'和另一個'''填充相應的值匹配類型?那麼從你的示例代碼中,你將得到一個包含「{」123「,」test「}的字典和包含」{「12」,123}「的第二個字典的結果? –

+0

我認爲這是http://stackoverflow.com/questions/569249/methodinfo-invoke-with-out-parameter的副本。您需要將傳遞給method.Invoke的數組存儲在變量中,並從中檢索結果。 –

回答

0

嘗試更換:

method.Invoke(null, new[]{values, result}); 

var invokeArgs = new[]{values, result}; 
method.Invoke(null, invokeArgs); 
//here you can check the invokeArgs[1] for the actual result of the conversion 

在任何情況下,我不知道你爲什麼會想轉換一個字典到另一個字典的類型,因爲這是你的代碼似乎做...

+0

謝謝,解決了這個問題。我試圖以通用的方式處理大約100種不同類型的字典,但將結果作爲類型化結果返回以存儲在其舊變量中。 – Monica

0

更改您的out對象obj參數的類型了牛逼的obj