Конечно, не работает. Есть ли способ, похожий на это?
Type newObjectType = typeof(MyClass);
var newObject = givenObject as newObjectType;
Конечно, не работает. Есть ли способ, похожий на это?
Type newObjectType = typeof(MyClass);
var newObject = givenObject as newObjectType;
newObjectType
- экземпляр класса Type
(содержащий метаданные о типе), а не сам тип.
Это должно работать
var newObject = givenObject as MyClass;
ИЛИ
var newObject = (MyClass) givenObject;
Приведение к экземпляру типа действительно не имеет смысла, поскольку время компиляции должно знать, какой тип переменной должен быть в то время, когда экземпляр типа представляет собой концепцию времени выполнения,
Единственный способ var
может работать, так как тип переменной известен во время компиляции.
Кастинг обычно представляет собой концепцию времени компиляции, т.е. вы должны знать тип во время компиляции.
Преобразование типов - это концепция времени выполнения.
Если вам нужно сделать вызов, используя переменную типа, и вы не знаете тип во время компиляции, вы можете использовать отражение: использовать 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();
Вы можете проверить, присутствует ли этот тип с помощью IsAssignableFrom
if(givenObject.GetType().IsAssignableFrom(newObjectType))
Но вы не можете использовать var здесь, потому что тип не известен во время компиляции.
Недавно я имел дело, что мне нужно было создать какой-то код, например, в ответы Томислава. К сожалению, во время генерации тип T был неизвестен. Однако была известна переменная, содержащая экземпляр этого типа. Решение < <забастовки > грязного взлома/обходного пути для этой проблемы:
public void CastToMyType<T>(T hackToInferNeededType, object givenObject) where T : class
{
var newObject = givenObject as T;
}
Тогда это можно назвать CastToMyType(instanceOfNeededType, givenObject)
и дать компилятору вывод T.
Возможно, вы можете решить это с помощью дженериков.
public void CastToMyType<T>(object givenObject) where T : class
{
var newObject = givenObject as T;
}