1

次のシナリオがあります。

public interface IParam
{
    Object Value {get;set;}
} 

public abstract class BaseClass: IParam
{
    public virtual object Value {get;set;}
}

public class IntSubClass:BaseClass
{
    public override object Value {get;set;}
}

外部には、このインターフェイスが公開されています。すべてのプロパティは、IParam を介してアクセスされます。このアプローチの欠点は、キャスティングの問題が多いことです。

IParam dummy = ParameterList[abc];
int index = (int)dummy.Value;

ジェネリックを使用してこの問題を解決する方法を教えてください。外部には、ジェネリック インターフェイスしか公開できません。

4

3 に答える 3

1

パラメータが異なるタイプである可能性があると仮定すると、単純に「いいえ」です。

ああ、ジェネリックを導入できます...しかし、それは物事を変えるだけです

int val = (int)(paramList["abc"].Value);

に:

int val = ((IParam<int>)paramList["abc"]).Value;

あまり役に立ちません。他の唯一のオプションは暗黙の変換演算子であり、interfacea: s では機能せず、b: はあまり明確ではありません。

率直に言って、キャストを使用するだけです。問題ありません。ボックス化/ボックス化解除はそれほど高価ではなく、コードの目的は明確です。

于 2012-05-14T07:29:14.787 に答える
0

内部で、すべての型のパラメーターを 1 つのリストにまとめて保持する必要がある場合は、共通の基本型によってのみアクセスできます。

内部では、それぞれ特定のタイプの個別のリストにパラメーターを保持できますが、それはおそらくあなたのシナリオではやり過ぎです。

于 2012-05-14T07:37:53.197 に答える
0

IParam<T>メソッドを持つインターフェイスを作成できますT Value {get; set;}。それはあなたの問題を解決するつもりですか?IParam にキャストすることはできませんが、適切な IParam を渡します。

于 2012-05-14T07:28:16.177 に答える