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 в следующем коде должны инициировать все NodeInput поля с default(T) когда мы создаем объект, который:

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]; 
Смежные вопросы