Вопрос по c# – Как я могу привести объект динамически?

5

Я почти уверен, что об этом спрашивали раньше, но, к сожалению, единственное, что я обнаружил, былоэтот это не было решением для меня. В моем текущем проекте я делаю что-то вроде:

private object obj;

private void Initialize()
{
    obj.Initialize();
}

private void CreateInstanceA()
{
    obj = Activator.CreateInstance(typeof(MyClassA));
}

private void CreateInstanceB()
{
    obj = Activator.CreateInstance(typeof(MyClassB));
}

Этот код, конечно, не работает, потому что я не разыгралobj потому что его тип меняется динамически.

Как я могу разыграть это динамически?

@PLB Затем используйте этот интерфейс для инициализации объекта. На самом деле, вы должны объявитьobj какprivate ICommonInterface obj так что ясно, чтоobj всегда будет реализовывать этот общий интерфейс. Raymond Chen
@RaymondChen Я только что сделал простой проект WinForm для тестирования моих библиотек классов. Leri
Похоже, что это не самый лучший способ идти о вещах. Вид кода пахнет для меня. Каков более широкий контекст того, что вы пытаетесь достичь? FishBasketGordo
@PLB Боюсь, мой вопрос не был достаточно ясным. Дай мне попробовать снова. & quot; Как работают другие методы в вашем классе (кромеInitialize, CreateInstanceA а такжеCreateInstanceB) использоватьobj Член & Quot; Какую бы технику ни использовали эти другие методы, вы можете использовать ееInitialize метод. Raymond Chen
Помимо инициализации, что еще вы собираетесь делатьobj? Raymond Chen

Ваш Ответ

2   ответа
0

Я предполагаю, что CreatInstanceB () должен фактически использовать MyClassB, правильно?

В этом случае вы можете использовать:

((MyClassA)obj).Initialize();

...

((MyClassB)obj).Initialize();

Или вы можете создать интерфейс, который имеет метод Initialize и определить obj как этот интерфейс.

Error: User Rate Limit ExceededdynamicError: User Rate Limit Exceeded Leri
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
9

Три варианта:

  • If you control both classes, and you can make them implement a common interface that includes everything you need, then do that - and cast to the interface
  • If you're using C# 4 and .NET 4, you can use dynamic typing - just declare the variable as private dynamic obj; and it will compile and find the right method at execution time
  • Otherwise, use reflection to find and call the method.

В принципеcasting основанный на типе времени выполнения не имеет смысла, так как часть смысла в приведенииcompiler больше информации ... и у вас просто нет этого в этом случае.

Первый вариант, безусловно, самый хороший, если вы можете достичь его.

Error: User Rate Limit Exceededis-aError: User Rate Limit Exceededcan-doError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededAssuming the types are similar in nature of course :)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы