2

私はこのような方法をたくさん持っています:

public UIPCompanyButton AddCompanyButton (string name, Company company, UIEventListener.VoidDelegate methodToCall, GameObject contents)
{
    return UIPCompanyButton.Create (name, company, methodToCall, contents);
}

次のような単一のメソッドに置き換えたいと思います。

    public T AddButton<T,K>(string name, K item, UIEventListener.VoidDelegate methodToCall, GameObject contents) where T:UIPMenuButton
{
    return T.Create(name, item, methodToCall, contents);
}

これは明らかに T.Create 部分では機能しません。これを行うために必要な特定の構文はありますか?

私はまた、同じ結果をもたらす別のメソッドを受け入れています。つまり、派生した menuButton を受け取り、適切なクラスの "item" で適切なメニュー ボタンを作成する単一のメソッドです。

4

4 に答える 4

3

いいえ、リフレクションなしではなく、ジェネリック型で静的メソッドを呼び出すことはできません。他のことは別として、ジェネリック型が特定の静的メンバーを持つように制約する方法はありません。それに最も近いのは、パラメーターなしのコンストラクター制約です。

于 2013-07-31T20:24:41.973 に答える
2

必要なのは、オブジェクトを作成するためのファクトリです。ここに小さな実例があります。これは、ファクトリ パターンを実装する最良の方法ではないかもしれませんが、うまくいくはずです。

詳細な例と説明については、このページを参照してください。

public class Button {
    public string Whatever { get; set; }

    public Button() {
        Whatever = "Hello, world!";
    }
}

public interface IAddButton {

    Button CreateButton();
}

public class ClassToMakeButtonFor1 {

    public static void RegisterMe() {
        ButtonFactory.Register(typeof(ClassToMakeButtonFor1), new ButtonFactory1());
    }
}

public class ButtonFactory1 : IAddButton {

    public Button CreateButton() {
        return new Button();
    }
}

public class ClassToMakeButtonFor2 {

    public static void RegisterMe() {
        ButtonFactory.Register(typeof(ClassToMakeButtonFor2), new ButtonFactory2());
    }
}

public class ButtonFactory2 : IAddButton {

    public Button CreateButton() {
        var b = new Button { Whatever = "Goodbye!" };
        return b;
    }
}

public static class ButtonFactory {
    private static Dictionary<Type, IAddButton> FactoryMap = new Dictionary<Type, IAddButton>();

    public static void Register(Type type, IAddButton factoryClass) {
        FactoryMap[type] = factoryClass;
    }

    public static Button MakeMeAButton<T>() where T : class {
        return FactoryMap[typeof(T)].CreateButton();
    }
}

internal class Program {

    private static void Main(string[] args) {
        ClassToMakeButtonFor1.RegisterMe();
        ClassToMakeButtonFor2.RegisterMe();

        Button b = ButtonFactory.MakeMeAButton<ClassToMakeButtonFor1>();
        Console.WriteLine(b.Whatever);

        b = ButtonFactory.MakeMeAButton<ClassToMakeButtonFor2>();
        Console.WriteLine(b.Whatever);
        Console.ReadLine();
    }
}
于 2013-07-31T21:02:42.970 に答える
1

考えられるのは、呼び出したい Create メソッドを定義するインターフェイス (ICreator など) を持つことです。

次に、型パラメーターをインターフェイスを実装する型に制限します (ここで T : ICreator)。

次に、静的メソッドではなく、インスタンスでメソッドを呼び出します。したがって、あなたの場合は、item.Create(...) を呼び出すことができます。

あなたのケースは理にかなっていますか?

于 2013-07-31T20:54:55.893 に答える