2

White/UIAutomation の画面リポジトリを反映したクラスがたくさんあります。リポジトリを使用するには、アプリケーション ウィンドウの画面を反映する多くのクラスを作成する必要があります。

リポジトリを作成するには、次の方法を使用します。

var repoReport = repository.Get<MyClassRepresentingWindow>("WindowTitle", 
InitializeOption.WithCache);

私が用意したクラスであるジェネリック型を渡します。

私がやりたいことは、Dictionary(stringClassName, string windowTitle) またはそのメソッドに渡す任意の Map を作成することです。問題は、Java ClassForName のように className を渡すことができないことです。

私は試しSystem.Activator ましたが、成功しませんでした。

Object configObj = System.Activator.CreateInstance(c);
Type c = System.Type.GetType("Namespace.MyClassRepresentingWIndow");

var myClass = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("Namespace.MyClassRepresentingWIndow");

Type type = assembly.GetType("Namespace.MyClassRepresentingWIndow");
object obj = Activator.CreateInstance(type);

var repoReport = repository.Get<c>("WindowTitle", 
InitializeOption.WithCache);

var repoReport = repository.Get<c.Name>("WindowTitle", 
InitializeOption.WithCache);

Update1 皆さん 、私はコードの前に座っているわけではありませんが、質問が複雑にならないように努めます。

これは、私が使用していると思われる White リポジトリで見つけた方法です: https://github.com/petmongrels/white/blob/itemsmap/Components/Repository/Source/ScreenRepository.cs

public virtual T Get<T>(string title, InitializeOption option) where T : AppScreen
    {
        ClearClosedScreens();
        AppScreen screen;
        var repositoryCacheKey = new ScreenRepositoryCacheKey(title, typeof (T));
        if (!screenCache.TryGetValue(repositoryCacheKey, out screen))
        {
            Window window = applicationSession.Application.GetWindow(title, IdentifiedOption<T>(option));
            screen = GetScreen<T>(window);
            screenCache.Add(repositoryCacheKey, screen);
        }

        if (screen != null)
            sessionReport.Next(typeof (T));
        return (T) screen;
    }

私が覚えているように、VS は .Get を .Get<"class" type> として表示しました。うまく表現できなくてごめんなさい。私はこの用語に精通していないので、私と一緒に患者を迎えてください。

Update2

最後に、次のようなものを取得したいと思います。

var repoReport1 = repository.Get<MyClassRepresentingWindow1>("WindowTitle", InitializeOption.WithCache);
var repoReport1 = repository.Get<MyClassRepresentingWindow2>("WindowTitle", InitializeOption.WithCache);
var repoReport1 = repository.Get<MyClassRepresentingWindow3>("WindowTitle", InitializeOption.WithCache);

そして、私は のコードを持っていますMyClassRepresentingWindow{1,2,3}。クラス名を Get メソッドに渡す方法がわかりません。入力時に、このクラスの文字列名があります。出力では、このメソッドが取得できるものを配信したいと考えてい.Get<T>ます。あなたが今私を理解してくれることを願っています。

4

2 に答える 2

3

実行時にのみ値がわかる変数型引数を使用してこれを呼び出すには、リフレクションを使用する必要があります。MethodInfoリポジトリのメソッドを表す方法を知っていると思いますGet<T>

それができたら、この例はMethodInfoオブジェクトの使用方法の基本的な考え方を示しています。repositoryこの例では、クラスがRepo;と呼ばれることを前提としています。必要に応じて変更します。

object InvokeGenericMethod(Repo repository, MethodInfo method, Type typeArg, string arg1, InitializeOption arg2)
{
    MethodInfo constructedMethod = method.MakeGenericMethod(typeArg);
    return constructedMethod.Invoke(repository, new object[] { arg1, arg2 });
}

もちろん、これをより一般的にすることもできますが、それでは例がわかりにくくなります。

于 2011-12-23T03:48:08.833 に答える
1

あなたが望むのは次のようなものだと思います:

    public string GetName<T>()
    {
        return typeof(T).Name;
    }

これにより、次の単体テストに合格します (「基本的な数学」は、スクラッチ アプリケーションで使用していた型にすぎません)。

    [TestMethod]
    public void Test_Of_Generic_Type_Name()
    {
        var myBuilder = new GenericNamer();

        Assert.AreEqual<string>("BasicMath", myBuilder.GetName<BasicMath>());
    }

タイプの完全な名前、アセンブリなどを使用することもできます。リフレクションを使用して Type クラスから引き出すことができるものについての詳細は次のとおりです。

http://msdn.microsoft.com/en-us/library/system.type.aspx

于 2011-12-22T17:42:51.543 に答える