2015-05-14 23 views
0

我有下面的struct,我需要通過System.Reflection創建它的實例。最大的問題是我有一個泛型和非泛型參數。我必須使用System.Reflection,因爲它會在T可以變化的循環中調用。我已經看過this,但我無法使用第二個參數(int標記)工作。對不起,我必須提出這個基本問題。構建具有通用參數和常規參數的泛型實例

struct pair<T> 
{ 
    public pair(T value,int tag) 
    {...} 
} 

所以我需要魔術在此:

object createPair(object o,int tag) 
{ 
    return *somemagic* 
} 

編輯:溶液與第一個答案使公衆結構組合。如果一個結構嵌套在一個通用結構中,則兩個答案都會拋出一個ArgumentException,而與輸入無關。我很抱歉不知道嵌套的這種影響。

+2

這味道就像[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。也許試着解釋你想要做什麼,而不是你想做什麼。 –

+0

認爲這將是太長,不好解釋。我想創建一個類似多字鍵的字典,並且可以使用相同的鍵添加對象。它將返回一個與給定鍵相匹配的對象數組。鍵的數量應該是可變的。 由於項目限制,我不允許在對結構中更改任何內容。 – leAthlon

+0

您是否在談論使用每個對象的_type_作爲對象的Key,還是允許任意的(但是允許碰撞)Key對象? – David

回答

3

鏈接的答案有效的原因是因爲Activator.CreateInstance的超負荷掛鉤到無參數公共構造函數中,也稱爲默認構造函數。

但是,同樣的方法有overloads其中包括接受參數的signature

public object CreatePair(object t, int tag) 
{ 
    var type = t.GetType(); 
    var targetType = typeof(Pair<>).MakeGenericType(type); 
    return Activator.CreateInstance(targetType, t, tag); 
} 
+0

'var targetType = typeof(Pair <>)。MakeGenericType(type);'拋出一個ArgumentException,因爲參數數量不匹配 – leAthlon

+0

問題仍然存在於相同的位置。 – leAthlon

+0

根據https://dotnetfiddle.net/XulN1e這段代碼應該運行良好。如果您的來源有所不同,請更新您的答案。 – David

2

請使用MakeGenericType方法的輸入型通用:

object createPair(object obj,int tag) { 
    Type type = typeof(Pair<>); 
    Type genericType = type.MakeGenericType(obj.GetType()); 
    return Activator.CreateInstance(genericType, obj, tag); 
} 

但是,如果有可能,我會用仿製藥,而不是反射。

+0

不起作用。 ArgumentException at'type.MakeGenericType(t)' – leAthlon

+0

@leAthlon你把它作爲參數發送了什麼? –

+0

請注意,由於該簽名聲明瞭'params object []',因此它認爲您正在尋找'.ctor(object [])',而不是'.ctor(T)' - 嘗試刪除'new object []'並直接傳遞參數。還要注意.ctor有兩個參數,'T'和'int',你也需要傳遞int。 – David