2011-12-22 8 views
2

私はWhite/UIAutomationから自分のスクリーンリポジトリを反映するクラスをたくさん持っています。 リポジトリを使用するには、自分のアプリケーションウィンドウの画面を反映するたくさんのクラスを作成する必要があります。Cでパラメータとしてジェネリック型を取得するメソッドにclassNameを渡すには

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

それは私が準備クラスがあるジェネリック型を渡す:

は、私は次のメソッドを使用してリポジトリを作成します。私が何をしたいか

は、そのメソッドに渡す辞書(stringClassName、文字列WINDOWTITLE)、または任意の地図を作成することです。 問題は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); 

アップデート1 みんな、私は、コードの前に座っていないが、私は私の質問はあまり複雑にするために頑張ります。私はVSは>に.get <「クラス」タイプとに.getを表示覚えたよう 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; 
    } 

これは私が私が使用して考えるホワイトリポジトリで見つかった方法です。すみません、私は自分自身をよく表現できません。私はこの用語に慣れていないので、患者さんは私と一緒にいてください。終わりにアップデート2

は、私はこのような何かを取得したい:

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>が得ることができるものを提供したいです。 私はあなたが今私を理解できることを願っています。

+0

あなたがしようとしていることについては混乱しています。問題を絞って騒音を取り除くことができれば、何をする必要があるのか​​がはっきりするかもしれません。 –

+2

Reflectionを使用できます。この記事をチェックしてください:http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method – Strillo

+0

Repository.Get はどのようにジェネリックパラメータで動作していますか? Activatorを使ってオブジェクトを作成すると思う人もいます。 –

答えて

1

私が何をしたいことは、このようなものであると信じて:

:合格するには、次のユニットテストを(「基本的な数学は」私はスクラッチアプリケーションに転がっていただけのタイプである)を引き起こす

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

:また、ここでは、リフレクションを使用してTypeクラスの外に引き出すことができますどのようにいくつかのより多くの情報がありますなど、アセンブリのタイプの完全な名前を使用することができ

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

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

こんにちはエリック、あなたの答えに感謝しますが、私は何か反対が必要だと思う。入力時に私は知っている私のクラスの文字列名を持って、私はこのクラスの作業コードを持っています。出力では、このメソッドが何かを提供したい。が受け入れる。私はあなたが私の言いたいことを知ってほしい – Robert

3

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

この例では、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 }); 
} 

もちろんこれをもっと一般的にすることもできますが、例があまり明確ではないでしょう。

関連する問題