2009-08-25 11 views
4

OracleClientライブラリバージョン1.0.5000.0を使用しており、OracleParameterクラスとその実装についてはICloneableと混同されています。なぜOracleParameterはICloneableを実装しますが、Clone()は提供しないのですか?

これはOracleParameterクラスの定義です:

public sealed class OracleParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable { 
    public OracleParameter(); 
    public OracleParameter(string name, object value); 
    public OracleParameter(string name, OracleType oracleType); 
    public OracleParameter(string name, OracleType oracleType, int size); 
    public OracleParameter(string name, OracleType oracleType, int size, string srcColumn); 
    public OracleParameter(string name, OracleType oracleType, int size, ParameterDirection direction, bool isNullable, byte precision, byte scale, string srcColumn, DataRowVersion srcVersion, object value); 

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    [RefreshProperties(RefreshProperties.All)] 
    [Browsable(false)] 
    public DbType DbType { get; set; } 
    [RefreshProperties(RefreshProperties.All)] 
    public ParameterDirection Direction { get; set; } 
    [Browsable(false)] 
    [DesignOnly(true)] 
    [EditorBrowsable(EditorBrowsableState.Never)] 
    [DefaultValue(false)] 
    public bool IsNullable { get; set; } 
    [DefaultValue(0)] 
    [Browsable(false)] 
    public int Offset { get; set; } 
    [RefreshProperties(RefreshProperties.All)] 
    public OracleType OracleType { get; set; } 
    [DefaultValue("")] 
    public string ParameterName { get; set; } 
    [DefaultValue(0)] 
    public byte Precision { get; set; } 
    [DefaultValue(0)] 
    public byte Scale { get; set; } 
    [DefaultValue(0)] 
    public int Size { get; set; } 
    [DefaultValue("")] 
    public string SourceColumn { get; set; } 
    public DataRowVersion SourceVersion { get; set; } 
    [DefaultValue("")] 
    [RefreshProperties(RefreshProperties.All)] 
    [TypeConverter(typeof(StringConverter))] 
    public object Value { get; set; } 

    public override string ToString(); 
} 

それはSystem.ICloneableを実装していますが、そこにはClone()方法がありません。

誰でもこれを説明できますか?

+0

本当にクラス全体ですか?コードはどこにありますか?リフレクター?あなたはそれをすべて見ていると確信していますか? – BFree

+0

visual studio 2008 F12 - メタデータから。 Hmmm ...リフレクターは面白いICloneable.Clone()オブジェクトを表示します... –

答えて

5
明示的に次の構文を使用して、インターフェース部材を実現することができる.NETで

:あなたが唯一の明示的方法を使用することができ、結果として

オブジェクトSystem.IClonable.Clone(){ }

を予想されるインターフェイスにキャストします。

またこれは、時間までの時間から来 http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracleparameter.system.icloneable.clone(VS.85).aspx

+0

ええ、私はそれを見ています。メタデータには表示されません。それは汚いトリックです。あなたはこの物がそこにあることを "知って"いなければなりません。 –

+1

これは、いくつかの必要なインターフェースを実装するのに良い解決策ですが、インテリセンスを汚染することはありません。 など。 c# "using"構文でDispose()を実装していますが、明示的な呼び出しのためのもう1つの "より良い"メソッドを提供しています。 "閉じる"。 – Mischa

+1

ええ、それは答えだと思うけど、私はこのような恐ろしいAPIデザインを見たことがあるかどうかは分かりません。派生パラメータをキャッシュして再利用しようとすると、クローンを作成しない限りエラーがスローされますが、クラスを逆アセンブルしたり、単に「知っていない」場合を除き、クローンを作成するメソッドは隠されます。 私は、OracleがAPI設計の輝かしい例ではありませんでしたが、これは完全に悪意のあるです。 –

2

を参照してください。 :)以下をチェックしてください...

void Main() 
{ 
    var e = new Example(); 
    I i = e as I; 

    e.m1(); // prints Class m1() 
    i.m1(); // prints Interface m1() 
} 

public interface I 
{ 
    void m1(); 
} 

public class Example : I 
{ 
    public void m1() 
    { 
    Console.WriteLine("Class m1()"); 
    } 

    void I.m1() 
    { 
    Console.WriteLine("Interface m1()"); 
    } 
} 
+0

ええ、今はそれを取得しますが、なぜ世界でメタデータに表示されないのでしょうか?それはただの意味です。 –

+0

エリソン陰謀である可能性があります。私は実際にはそれほどショックを受けていません。しかし、私はReflector(http://www.red-gate.com/products/reflector/)がそれを見ると確信しています。 –

+0

ええ、リフレクターがそれを拾いましたが、それはAPIの非常識なビットです。そのクラスで何か便利なことをしたいのであれば、それをクローンしなければならないようですが、その操作はコードを逆アセンブルしたくない人からは見えません。 –

関連する問題