Вопрос

У меня есть один класс по имени и один класс B

public class A : UserControl { }

public class B : UserControl { }

Теперь у меня есть одна сборка, функция класса которой принимает объекты класса A. Эта сборка не создана мной, поэтому у меня нет контроля. В основном это 3-я партийная ассамблея.

Но я хочу поставить свои объекты класса B, поскольку это немного настроено. Отдых гарантировал, что он содержит все свойства класса А. Как я могу пописать свой объект класса B, чтобы ввести a, чтобы я мог интегрировать 3-й партийную сборку в моем проекте, а также настроить внешний вид в соответствии с моими потребностями?

Если я так что-то вроде (A)objB Это не разрешено. Затем я попробовал это:

UserControl control = objB as UserControl;

A objA = control as A;

Но проблема в этом случае - это нуль.

Чтобы избежать путаницы: класс A и сборка предоставляется 3-й партией.

Заранее спасибо :)

Это было полезно?

Решение

Учитывая свою иерархию, вам придется написать оператор преобразования. Нет встроенного способа сделать это в целом (думаю Dog : Animal и Cat : Animal):

public static explicit operator A(B b) {
    // code to populate a new instance of A from b
}

Вы также можете использовать общую структуру отражения и сделать что-то вроде

public static void PropertyCopyTo<TSource, TDesination>(
    this TSource source,
    TDestination destination
) {
    // details elided
}

так что тогда вы могли бы сказать

// b is B
// a is A
b.PropertyCopyTo<A>(a);

который будет скопировать все общие свойства между b к a.

Другие советы

За B быть брошенным к A, B должен наследовать A. Отказ Даже если B содержит все свойства A, это все еще не A.

Вы можете использовать шаблон адаптера

Глянь сюда

Если B нельзя бросить до (как в B is A) невозможно добиться того, что вы пытаетесь сделать без наследства от A. К сожалению, C # не поддерживает Утка печатает В отличие от многих динамических языков (например, Ruby).

Вы можете наследовать от класса A:

public class B : A {
}

И если вам нужно перераспределить некоторые методы / свойства, просто установили их virtual в классе А.

Я думаю, что вы на самом деле не можете это сделать.

Почему бы не добавлять свои свойства в частичный класс A?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top