2012-02-05 3 views
10
public class BusinessObjects<O> 
    where O : BusinessObject 
{ 
    void SomeMethod() 
    { 
     var s = O.MyStaticMethod(); // <- How to do this? 
    } 
} 

public class BusinessObject 
{ 
    public static string MyStaticMethod() 
    { 
     return "blah"; 
    } 
} 

これを達成するための正しいオブジェクト指向のアプローチがありますか、または反射に頼る必要がありますか?ジェネリック型の静的メソッドにアクセスする方法

EDIT:私はこの問題について過度に単純化しようとすると行き過ぎて、重要な点を除外しました。 MyStaticMethodはリフレクションを使用し、正しい結果を返すために派生型が必要です。しかし、私はちょうど私の静的な仮想メソッドを持つことができないと私はそれが私が必要と思う私のデザインにもう一つの欠陥を実現した。

私は、この問題に対する別のアプローチを完全に見つける必要があるように見えます。

+0

詳細はこちらhttp://stackoverflow.com/q/196661/114029 –

+0

これはかなり良い質問だと思います。現在、C#で行うことはできません。しかし、これはMicrosoftが.Net 5+に追加するのに便利です – MarzSocks

答えて

2

あなたは、このような静的メンバを参照することはできません理由:

O.MyStaticMethod(); 

ですあなたはどのタイプのOがわからないからです。はい、BusinessObjectから継承されますが、静的メンバーはタイプ間で継承されないため、BusinessObjectからMyStaticMethodのみを参照できます。

+0

@DanielHilgarth、間違った例を削除しました。コンパイラでは派生クラスを介して静的メソッドを呼び出すことはできますが、静的メンバーは継承されません。生成されたILは、実際には基本クラスのメソッドを呼び出すことになります。また、コンパイラでも可能ですが、派生型の静的メソッドを参照することは悪い形式であり、特に作成パターンを使用する場合は混乱を招く可能性があります。 – roken

+0

コンパイラが 'Foo.MyStaticMethod()'を 'BusinessObject.MyStaticMethod()'に変更するとあなたのコメントに間違いはありません。しかし、これはあなたの答えを正しくしません。単純に正しいのではなく、 'BusinessObject'から' MyStaticMethod'を参照できるだけです(「呼び出し」を意味しますか?)。 –

+0

Oはジェネリック型パラメータです。既に同意したように、型間に静的メソッドの継承はないため、このコンテキストでBusinessObjectから派生したいくつかの型Oでこのメソッドを呼び出すことはできません。コンパイラチームは、明示的な型名の場合と同じようにここでいくつかの魔法を提供することができましたが、[感謝して]彼らはしませんでした。私は私の答えがそれほど冗長ではないと同意しますが、私はまだそれを間違って呼ぶつもりはありません。 – roken

12

タイプに制約されていても、ジェネリック型パラメータを使用して静的メソッドにアクセスすることはできません。ただ、拘束されたクラスを直接

var s = BusinessObject.MyStaticMethod(); 

注意を使用する:あなたは、反射せずに可能ではありませんOのインスタンス化のタイプに基づいて静的メソッドを呼び出すために探している場合。 .NETのジェネリックスは、コンパイル時に静的にメソッドにバインドされます(インスタンス化時にバインドするC++とは異なります)。インスタンス化された型の静的メソッドに静的にバインドする方法はないため、これは不可能です。仮想メソッドは、静的に仮想メソッドにバインドしてから、インスタンス化された型の正しいメソッドを動的ディスパッチで呼び出すことができるため、少し異なります。

+0

私は十分な情報を提供していないと思います。更新された質問を一時的に確認してください... –

+0

@BrandonMooreは、制限についてもう少し詳しく説明するために私の答えを少し更新しました – JaredPar

+0

ええと、私は仮想的な静的メソッドを持つことができないので、私は反射が行く方法になると思う。 –

2

あなたはなぜちょうどこのようにそれを呼び出すことはありませ、BusinessObjectから継承するOを強制している場合:

void SomeMethod() 
{ 
    var s = BusinessObject.MyStaticMethod(); // <- How to do this? 
} 
+0

更新された質問を参照 –

関連する問題