Динамически привести тип

Рейтинг: 2Ответов: 1Опубликовано: 19.04.2015
object obj = ....
Type mytype = this.GetType();
var objType = (mytype)obj;

Вот так не получается( в object на самом деле находится другой тип переменной, но заранее не известно какой, однако известно что this.GetType() ей всегда соотвествует.

Ответы

▲ 1Принят

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

Вам может помочь тип dynamic. Однако вы должны знать, какие операции поддерживает объект. Небольшой пример:

class Program
{
    static void Main(string[] args)
    {
        dynamic fooValue = Foo(); // тип возвращаемого значения заранее неизвестен
        Console.WriteLine(fooValue.Length); // выводит 5

        dynamic barValue = Bar(); // тип возвращаемого значения заранее неизвестен
        Console.WriteLine(barValue.R); // выводит 255
    }

    private static object Foo()
    {
        return "Hello";
    }

    private static object Bar()
    {
        return Color.White;
    }
}

Также вы можете возспользоваться рефлексией и запрашивать/устанавливать нужные поля/свойства/вызывать методы сперва получая ссылку на них с помощью Type.GetField()/Type.GetProperty()/Type.GetMethod(), а затем работая с помощью FieldInfo/PropertyInfo.GetValue()/SetValue() и MethodInfo.Invoke() (что менее удобно, конечно).