Приведение одного объекта к другому типу - PullRequest
5 голосов
/ 23 ноября 2010

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

public class A : UserControl { }

public class B : UserControl { }

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

Но я хочу предоставить свои объекты класса B, так как он немного настроен. Будьте уверены, что он содержит все свойства класса A. Как я могу типизировать мой объект класса B к типу A, чтобы я мог интегрировать стороннюю сборку в мой проект, а также настроить внешний вид в соответствии со своими потребностями?

Если я что-то вроде (A)objB, то это не разрешено. Тогда я попробовал это:

UserControl control = objB as UserControl;

A objA = control as A;

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

Во избежание путаницы: класс А и сборка осуществляется сторонней организацией.

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

Ответы [ 6 ]

4 голосов
/ 23 ноября 2010

Учитывая вашу иерархию, вам придется написать оператор преобразования.В общем, не существует встроенного способа сделать это (например, 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.

2 голосов
/ 23 ноября 2010

Чтобы B можно было преобразовать в A, B должно наследовать A.Даже если B содержит все свойства A, это все равно не A.

1 голос
/ 23 ноября 2010

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

См. Здесь

0 голосов
/ 23 ноября 2010

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

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

0 голосов
/ 23 ноября 2010

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

0 голосов
/ 23 ноября 2010

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

public class B : A {
}

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

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