2016-01-22 2 views
0
Type hai = Type.GetType("TestStringObject", true); 
var obj = (Activator.CreateInstance(hai)); 
tata = CreateClass<obj>(); 

Я хочу сделать что-то вроде этого, но общий класс не распознает obj как объект или тип?Я пытаюсь передать объект или тип в класс, который принимает общий тип

Могу ли я это сделать?

+0

Можете ли вы предоставить код для 'CreateClass' и предоставить сообщения об ошибках, которые вы получаете, если они есть? – Chase

+0

заменить CreateClass на JsonConvert.DeserializeObject <> любой класс, который принимает общий объект .... –

+0

Является ли TestStringObject классом в вашем проекте? Вы используете 'GetType', потому что вы не знаете тип до времени выполнения? – Chase

ответ

0

В вашем примере вы используете obj как тип, когда это экземпляр объекта. Аргумент generic type должен быть классом, а не экземпляром или типом, и должен быть известен во время компиляции.

Если TestStringObject класс в вашем проекте, вы можете использовать его в качестве универсального типа аргумента, как так:

tata = CreateClass<TestStringObject>(); 

Если вы не знаете тип во время компиляции, вы можете создать универсальный метод чтобы соответствовать неизвестному типу (предоставленному как строка) во время выполнения и вызывать ваш общий метод таким образом. В приведенном ниже примере я собираюсь предположить, что существует класс с именем TestStringObject, который имеет общий метод с именем CreateClass; Ваше точное положение может измениться, но это должно сделать то, что вам нужно:

TestStringObject:

namespace Test 
{ 
    class TestStringObject 
    { 
     public void CreateClass<T>() 
     { 
      Console.WriteLine("CreateClass Invoked"); 
     } 
    } 
} 

В другом месте ...

// Get the type of the unknown type, provided here as a string. 
Type type = Type.GetType("Test.TestStringObject", true); 
// Create an instance of the unknown type. 
object obj = Activator.CreateInstance(type); 
// Get a reference to the 'CreateClass' generic method info. 
MethodInfo method = type.GetMethod("CreateClass"); 
// Get a reference to a version of the generic method that accepts the unknown type as a generic type argument. 
MethodInfo genericMethod = method.MakeGenericMethod(type); 
// Invoke the generic method of the unknown type. 
genericMethod.Invoke(obj, new object[] { }); 

Пожалуйста, обратите внимание на пространство имен, которые должны быть включены, когда вызывая GetType, поскольку для этого требуется полное имя.

Смежные вопросы