2017-01-23 11 views
0

私はそれを与えるモデルに基づいて私のためのフォームを作成する関数を構築しました。クラスの型を取得して汎用関数で使用する方法は?

using MyProject.Models; 
... 
public partial class CRUDPage : ContentPage 
{ 
    public CRUDPage() 
    { 
     InitializeComponent(); 
     Teacher teacher = new Teacher 
     { 
      id = 1, 
      name = "John Smith", 
      DOB = new DateTime(1995, 9, 12), 
      place = "Hebron", 
      salary = 20.5 
     }; 
     //set the content of the page >>> PCL, Xamarin.forms 
     Content = new FormGenerator<Teacher>().GenerateForm(teacher); 
    } 
} 

私は、あらゆる種類のモデルを使用してフォームを作成できるようにして、コードを動的にしようとしていますが、運がありません。コードはこのようなものでなければなりません。

public partial class CRUDPage : ContentPage 
{ 
    public CRUDPage(object entity) 
    { 
     InitializeComponent(); 
     Content = new FormGenerator<typeof(entity) >().GenerateForm(entity); 
    } 
} 

しかし、上記のコードは機能しません。 Typeのように見えるのはClassと同じではありません。

オブジェクトの「クラスタイプ」を関数のジェネリック型として使用するにはどうすればよいですか?

+0

[Reflectionを使用して汎用メソッドを呼び出すにはどうすればいいですか?](0120-32535/2803565) –

+0

GenerateFormメソッドのロジックは何ですか?このメソッドでは、渡されるオブジェクトの型がわかり、フォームを作成するために使用できるリフレクションを使用して、すべてのプロパティにアクセスできます。 –

+0

FormGeneratorのコンストラクタとGenerateFormのコードを表示できますか? –

答えて

0

実行時にタイプが分かっているインスタンスを作成するには、MakeGenericTypeを使用する必要があります。

public CRUDPage(object entity) 
{ 
    InitializeComponent(); 
    var type = typeof(FormGenerator<>).MakeGenericType(new [] { typeof(entity) }); 
    var instance = Activator.CreateInstance(type); 
    Content = instance.GetType().GetMethod("GenerateForm").Invoke(instance, new[] { entity }); 
} 

これは実際のジェネリックを使用するよりもはるかに遅いことに注意してください。

+0

コードで2行目と4行目に2つのエラーが表示されます。 'entity 'は変数ですが型のように使用されます' '' Type 'には' GetMethod 'の定義が含まれておらず、' Type 'の最初の引数を受け入れる拡張メソッド' GetMethod 'はありませんusingディレクティブやアセンブリ参照がありません) ' –

+0

@ YazanWYusuf' using System.Reflection'を追加する必要があるかもしれません。 .NETコアを使っているなら、 'GetTypeInfo()' IIRCかもしれません。 – Scott

1

FormGeneratorの画像を見ると、mformTになる必要がありますか? objectの場合でもコードは機能しますか?もしそうなら、ジェネリックを取り除いて問題を解決することができます。

関連する問題