1

怎麼假設我們有一個NodeInput類是這樣的:我需要創建<T>類的對象,但我不知道T和我的計劃是找到使用泛型噸,但我不知道

public class NodeInput 
{ 

} 
public sealed class NodeInput<T> : NodeInput 
{ 

} 

我們有Node類,如下所示:

public abstract class Node 
{ 
    public Node() 
    { 
     var fieldInfos = GetType().GetRuntimeFields(); 
     // loop through all NodeInputs using their concrete base type 
     foreach (var item in fieldInfos) 
     { 
      Type t = item.FieldType; 
      if (t.BaseType == typeof(NodeInput)) 
      { 
       // Here I want to initialize each NodeInput field according to 
       // the T but I don't know what the T is here. 
      } 
     } 
    } 
} 

我已經創建了具體的父類NodeInput這樣我就可以算出來的所有NodeInput<T>不論其T參數類型。但我還需要T來創建適當的對象並分配給循環中的每個字段。 對於下面的代碼示例PointNode應主動與default(T)所有NodeInput領域,當我們創建一個對象:

public class PointNode : Node 
{ 
    public NodeInput<double> x; 
    public NodeInput<int> y; 
    public NodeInput<float> z; 
} 
PointNode node = new PointNode(); 
// Now x,y and z should be 0 = default(double),default(int),default(float) 

這可能嗎?

+2

這個問題很相似,你的另一個問題(http://stackoverflow.com/questions/31388962/method-與泛型收益型但並非通用輸入 - 是 - 這-可能)。就像以前一樣,我嚴重懷疑你在這裏採用的設計方法。你能否在更高的層面上描述你想解決的問題?爲了更具體地說明我的擔憂:爲了正確封裝和鬆散耦合,只有NodeInput必須知道如何填充其成員,而不是節點或任何其他類。 – Christoph

+1

更好的辦法是把它放在'Node '的構造函數中。這將消除反思的需要並強化類型安全。 –

回答

0

如果我理解你的權利,你可以得到節點泛型類型是這樣的:

var genericType = item.FieldType.GenericTypeArguments[0]; 
相關問題