0

内部コードが複数の異なるクラスを操作できる静的メソッドがあります。ただし、実行時にクラスをメソッドに入れる方法がわかりません。

たとえば、ClassA と ClassB があるとします。

私のメソッドはこれらのクラスのいずれかで動作するので、パラメーターを次のようにします。

public static void MyMethod(Object obj)
{
    //...obj is either ClassA or ClassB
    //...do work on variable class
}

しかし、どちらかを試してみると、無効な引数メッセージが表示され続けます

ClassA a = new ClassA();
MyMethod(a);

ClassB b = new ClassB();
MyMethod(b)

実行時まで Type が不明なパラメータを持つことさえ可能ですか?

もしそうなら、どうすればいいですか?

そうでない場合、多くのクラスで何らかの機能を実行するメソッドを、すべてのクラスでメソッドコードを繰り返さずに、このように利用するにはどうすればよいでしょうか?

編集 - 私のコードは実際にクラス名だけでなくクラスのインスタンスを渡すため、上記を編集しました。ただし、無効な引数メッセージは引き続き表示されます。

4

6 に答える 6

2

ClassAが型名であると仮定すると、その構文は有効ではありません。タイプのインスタンス、またはタイプの を渡す必要がありますType

MyMethod(new ClassA());

また

MyMethod(typeof(ClassA));

後者の場合、ジェネリックを使用するようにリファクタリングすることも検討できます。

MyMethod<ClassA>();

実行時まで Type が不明なパラメータを持つことさえ可能ですか?

絶対; object問題はありませんが、そのパラメーターに有効な値を指定する必要があります。

于 2013-01-16T09:34:02.063 に答える
1

クラスのインスタンス (オブジェクト) を渡す必要があります。試す:

MyMethod(new ClassA());
MyMethod(new ClassB());

overloading次のような MyMethodをお勧めします。

public void MyMethod(ClassA a) { ... }
punlic void MyMethod(ClassB b) { ... }
于 2013-01-16T09:35:49.993 に答える
0

MyMethodリチャードが提案したように、オーバーロードする必要があります。

メソッド定義を 1 つだけ使用したい場合は、次のようなものを使用できます。

public static void UnknownArgumentsMethod2(params object[] list)
{
    foreach (object o in list)
    {
        if (o.GetType() == typeof(int))
        {
            Console.WriteLine("This is an integer: " + (int)o);
        }
        else if (o.GetType() == typeof(ClassA))
        {
            Console.WriteLine("This is an object of ClassA");
        }
    }
}
于 2013-01-16T09:38:27.707 に答える
0

タイプのインスタンスではなく、タイプを渡しています。

代わりにこれを考慮してください:-

var test = new ClassA();
MyMethod(test);
于 2013-01-16T09:34:14.770 に答える
0

実はここにエラーがありました -

public static void MyMethod(Object obj)

次のようにパラメータを変更したら:

public static void MyMethod(object obj)

それはうまくいきました:)

于 2013-01-16T10:37:37.107 に答える
0

ClassA と ClassB の関数シグネチャが同じ場合は、インターフェイスの使用を検討してください。実装も同じ場合は、基本抽象クラスで実装し、必要に応じて継承クラスでオーバーライドします。

interface IMyInterface
{
    void MethodX();
}

abstract class ClassBase: IMyInterface
{
    public virtual void MethodX()
    {
        Console.WriteLine("MethodX from base class");
    }
}

// this will use base class implementation of MethodX
class ClassA : ClassBase
{
}

class ClassB : Classbase
{
    public void MethodX()
    {
         Console.WriteLine("MethodX from ClassB");
    }
}


class Foo
{
    public void MyMethod(IMyInterface obj)
    {
        obj.MethodX();
    }
}



Foo f = new Foo();

IMyInterface ca = new ClassA();
f.MyMethod(ca);  // This Print MethodX from ClassA, in this case BaseClass

IMyInterface cb = new ClassB();
f.MyMethod(cb);  // This Print MethodX from ClassB
于 2013-01-16T09:45:12.753 に答える