Можно ли сделать динамический c удав? - PullRequest
1 голос
/ 13 января 2020

Как выполнить downcast со строго известным во время выполнения типом?

public class A {}

public class B : A { public int i; }

public class C
{
    B b = new B();
    A a = b;               // here upcast, and "a" still keeps link to "b"
    ((B)a).i;              // no problem it works

    Type t = b.GetType();  // BUT how to downcast with strongly runtime known type ?
    ((t)a).i;              // like here
}

1 Ответ

4 голосов
/ 13 января 2020

Проблема с любым преобразованием во время выполнения, например с использованием Convert.ChangeType, возвращает только object, что означает, что вы не сможете сделать что-либо полезное (например, установить свойство) без использования отражения.

Одной из возможностей для «Я не знаю тип, но я уверен, что могу установить данное свойство» является использование dynamic:

B b = new B();
A a = b; 
dynamic x = a;
x.i = 100;
Console.WriteLine(b.i); /// writes 100.

Живой пример: https://rextester.com/WJDQQ44845

Обратите внимание, это показывает соответствующую ошибку, если вы пытаетесь вызвать свойство / метод, который не существует:

x.nosuchproperty =  100;

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ' Rextester.B 'не содержит определения для' nosuchproperty '

...