В вашем примере вы используете 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
, поскольку для этого требуется полное имя.
Можете ли вы предоставить код для 'CreateClass' и предоставить сообщения об ошибках, которые вы получаете, если они есть? – Chase
заменить CreateClass на JsonConvert.DeserializeObject <> любой класс, который принимает общий объект .... –
Является ли TestStringObject классом в вашем проекте? Вы используете 'GetType', потому что вы не знаете тип до времени выполнения? – Chase