5

Aという名前のクラスとBという名前のクラスが1つあります

public class A : UserControl { }

public class B : UserControl { }

これで、クラスの関数がクラスAのオブジェクトを受け入れるアセンブリが1つあります。このアセンブリは私が作成したものではないため、制御できません。基本的にはサードパーティのアセンブリです。

しかし、クラスBは少しカスタマイズされているので、オブジェクトを提供したいと思います。クラスAのすべてのプロパティが含まれているので安心してください。クラスBのオブジェクトをタイプAに型キャストして、サードパーティのアセンブリをプロジェクトに統合したり、ニーズに応じてルックアンドフィールをカスタマイズしたりするにはどうすればよいですか?

もしそうなら、そのような(A)objBことは許可されていません。それから私はこれを試しました:

UserControl control = objB as UserControl;

A objA = control as A;

ただし、この場合の問題は、objAがnullであるということです。

混乱を避けるために:クラスAとアセンブリはサードパーティによって提供されます。

前もって感謝します :)

4

6 に答える 6

4

Given your hierarchy, you will have to write a conversion operator. There is no built-in way to do this in general (think Dog : Animal and Cat : Animal):

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

You could also use a generic reflection framework and do something like

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

so then you could say

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

which would copy all the common properties between b to a.

于 2010-11-23T15:58:52.743 に答える
2

For B to be castable to a A, B must inherits A. Even if B contains all properties of A, it's still not a A.

于 2010-11-23T16:00:03.753 に答える
1

you may use an Adapter pattern

See Here

于 2010-11-23T15:58:35.317 に答える
0

If B cannot be cast to A (as in B is A) it is not possible to achieve what you are trying to do without inheriting from A. Unfortunately C# doesn't support duck typing unlike many dynamic languages (i.e. Ruby).

于 2010-11-23T15:59:23.730 に答える
-1

You can inherit from class A:

public class B : A {
}

And if you need to overrride some methods/properties just set them to virtual in class A.

于 2010-11-23T15:58:39.140 に答える
-1

I think you actually cannot do it.

Why not adding your properties to a partial class A?

于 2010-11-23T16:00:25.490 に答える