Подтвердить что ты не робот

Объект-литье с переменной типа

Конечно, не работает. Есть ли способ, похожий на это?

Type newObjectType = typeof(MyClass);

var newObject = givenObject as newObjectType;
4b9b3361

Ответ 1

newObjectType - экземпляр класса Type (содержащий метаданные о типе), а не сам тип.

Это должно работать

var newObject = givenObject as MyClass;

ИЛИ

var newObject = (MyClass) givenObject;

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

Единственный способ var может работать, так как тип переменной известен во время компиляции.


UPDATE

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

Преобразование типов - это концепция времени выполнения.


ОБНОВЛЕНИЕ 2

Если вам нужно сделать вызов, используя переменную типа, и вы не знаете тип во время компиляции, вы можете использовать отражение: использовать Invoke метод MethodInfo on экземпляр типа.

object myString = "Ali";
Type type = myString.GetType();
MethodInfo methodInfo = type.GetMethods().Where(m=>m.Name == "ToUpper").First();
object invoked = methodInfo.Invoke(myString, null);
Console.WriteLine(invoked);
Console.ReadLine();

Ответ 2

Вы можете проверить, присутствует ли этот тип с помощью IsAssignableFrom

if(givenObject.GetType().IsAssignableFrom(newObjectType))

Но вы не можете использовать var здесь, потому что тип не известен во время компиляции.

Ответ 3

Недавно я имел дело, что мне нужно было создать какой-то код, например, в ответы Томислава. К сожалению, во время генерации тип T был неизвестен. Однако была известна переменная, содержащая экземпляр этого типа. Решение < <забастовки > грязного взлома/обходного пути для этой проблемы:

public void CastToMyType<T>(T hackToInferNeededType, object givenObject) where T : class
{
   var newObject = givenObject as T;
}

Тогда это можно назвать CastToMyType(instanceOfNeededType, givenObject) и дать компилятору вывод T.

Ответ 4

Возможно, вы можете решить это с помощью дженериков.

public void CastToMyType<T>(object givenObject) where T : class
{
   var newObject = givenObject as T;
}