1

メソッドのパラメーターの 1 つとして列挙型を渡すにはどうすればよいですか? メソッドの一部の実装でのみ必要であり、他の実装では必要ありません。メソッド宣言は次のようになります。

public abstract void SomeMethod(params object[] someParams);

そして、それが私がいくつかの実装をどのように見せたいかです:

public override void SomeMethod(params object[] someParams) {

    SomeEnum someEnum = someParams[0];
    if (someEnum == null)
        return;

}

もちろん、このコードは無効ですが、私が意図していることを示しています。メソッドの他の実装では、他の列挙型を使用するか、列挙型をまったく使用しない場合があります。

更新:多くの人が述べているように、ウィンドウからタイプ セーフをスローするのは非常に奇妙なことです。だから、なぜ私がこれをしているのかを説明することにしました。

クラスのさまざまなサブクラスにメソッド呼び出しを渡す必要があります。このメソッドは、ネットワークを介して (ローカルでも) 送信し、特定の時間に特別な順序で実行するシステムを介してこのメ​​ソッドを宣言します。これを行うより良い方法はありますか?

4

4 に答える 4

4

params他のオブジェクトと同様に、キーワードを使用して型の列挙値を渡すことができます。

public override void SomeMethod(params SomeEnum[] someEnums) 
{
     foreach(SomeEnum e in someEnums)
     {

     }
}

このメソッドに他の列挙型も渡す必要がある場合はSystem.Enum、すべての列挙型がそこから派生するため、パラメーターとして使用できます。少し強めのタイピング。

public override void SomeMethod(params Enum[] enums) 
{
    //something like
    var @enum = enums[0];
    if (!(@enum is SomeEnum))
        return;

    var someEnum = (SomeEnum)@enum;
}

編集を承認するための最良の方法は、メソッド呼び出し中に渡すオブジェクトをメソッドのシグネチャとして明示的に指定することです。params渡すパラメーターの数を可変にする必要がある場合にのみ、キーワードに依存する必要があります。それ以外の場合は、署名を明示的に宣言することに固執する必要があります。列挙型SomeEnumがオプションの場合は、最後にオプションのパラメーターとして宣言できます。このような:

public override void SomeMethod(int a, string b, SomeEnum? someEnum = null) 
{
    if (someEnum == null)
       //handle the logic here
}
于 2012-10-25T17:01:04.577 に答える
4
public override void SomeMethod(params object[] someParams)
{
    if (!(someParms[0] is SomeEnum))
        return;

    var se = (SomeEnum) someParams[0];
    ...
}

明示的に型指定されたパラメーターに対してこれを実行したい理由はまったくわかりませんが、私には想像できません。

于 2012-10-25T17:01:43.440 に答える
2

基本的に、署名からあらゆる種類の強力な型付けを削除して、ここで本当にトラブルを求めているようです。キャストする必要があります。

第 2 に、SomeEnumenum は値型であるため、type の値を null にすることはできません。したがって、次のように書くことができます。

public override void SomeMethod(params object[] someParams)
{
    if (someParams[0] == null)
    {
        return;
    }
    // This will throw an exception if you've been given the wrong kind
    // of argument. I prefer that to just silently returning, as it would
    // usually indicate a programming error which should be fixed.
    SomeEnum someEnum = (SomeEnum) someParams[0];
    ...    
}

ただし、より厳密に型指定された方法でパラメーターを表す方法を考えたほうがよいでしょう。残念ながら、より多くの情報がなければ、私たちはあなたがそれを行う手助けをすることはできません.

于 2012-10-25T17:01:42.833 に答える
1

通常、異なるパラメーターが必要な場合は、オーバーライドではなく、メソッドの異なる実装にオーバーロードを使用すると思います。これらは最後にパラメータを持つことができます:

void M(SomeEnum someEnum, params object[] someParams)
{
   //...

ただし、コードはこの署名でも機能します。

public override void SomeMethod(params object[] someParams) {

    if (someParams.Length == 0 or !(someParams[0] is SomeEnum))
        return;

    SomeEnum someEnum = (SomeEnum)someParams[0];
    //...
于 2012-10-25T17:04:14.137 に答える