0

タイプに依存するファーストクラスまたはセカンドクラスの可変結果メソッドに設定したいのですが、コードの何が問題になっていますか?

    public ActionResult Contact()
    {
        ViewBag.Message = GetValue(new ClassOne(), "classOne");

        return View();
    }



    public string GetValue<T>(T customClass, string type)
    {
        if (type == "classOne") return customClass.ClassOneMethod();
        else customClass.ClassTwoMethod();
    }

    class ClassOne
    {
        public string ClassOneMethod()
        {
            return "ClassOneMethod";
        }
    }

    class ClassTwo
    {
        public string ClassTwoMethod()
        {
            return "ClassTwoMethod";
        }
    }
4

2 に答える 2

2

T問題は、コンパイラがコンパイル時に型について何も知らず、に含まれるオブジェクトにorcustomClassというメソッドがあることを認識できないことです。たとえば、仮想メソッドをオーバーライドする共通の基本クラスから派生したり、インターフェイスを実装したりするなど、いくつかのオプションがあります。ClassOneMethodClassTwoMethod

ここでは、インターフェースを使用してそれを行う方法に関するヒントをいくつか紹介します。これは完璧にはほど遠いですが、私はそれを元のコードにかなり近づけようとしました。

interface IHaveAMethod
{
    String GetString();
}

public ActionResult Contact()
{
    ViewBag.Message = GetValue(new ClassOne());

    return View();
}

public String GetValue<T>(T customClass) where T : IHaveAMethod
{
    return customClass.GetString();
}

class ClassOne : IHaveAMethod
{
    public String GetString()
    {
        return "ClassOneMethod";
    }
}

class ClassTwo : IHaveAMethod
{
    public String GetString()
    {
        return "ClassTwoMethod";
    }
}
于 2012-12-13T17:45:19.717 に答える
2

クラスに同じ定義がないため、コードは機能しません。次のようにコードを変更して、コードを実行することができます。

public ActionResult Contact()
{
    ViewBag.Message = GetValue<MyInterface>(new ClassOne());
    return View();
}

public string GetValue<T>(T customClass, string type)
{
    return customClass.MyMethod
}

class ClassOne : IMyInterface
{
    public string MyMethod()
    {
        return "ClassOneMethod";
    }
}

class ClassTwo : IMyInterface
{
    public string MyMethod()
    {
        return "ClassTwoMethod";
    }
}

public Interface IMyInterface
{
    string MyMethod();
}
于 2012-12-13T17:49:26.770 に答える