C# 如何获取类的类型并在泛型函数中使用它?

C# 如何获取类的类型并在泛型函数中使用它?,c#,generics,C#,Generics,我构建了一个函数,根据我给出的模型为我创建表单 using MyProject.Models; ... public partial class CRUDPage : ContentPage { public CRUDPage() { InitializeComponent(); Teacher teacher = new Teacher { id = 1, name = "John

我构建了一个函数,根据我给出的模型为我创建表单

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);
    }
}
但是上面的代码不起作用;看起来类型与类本身不同

如何获取对象的类类型以将其用作函数中的泛型类型?

您必须使用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 });
}

请注意,这比使用真正的泛型慢得多。

查看FormGenerator的图像,mform是否需要是T?如果代码是对象,它还会工作吗?如果是这样,您可以去掉泛型并解决问题。

请参阅这个问题:GenerateForm方法的逻辑是什么。通过这种方法,您可以知道所传递对象的类型,并且可以使用反射来访问它的所有属性,您可以使用反射来创建表单。您可以显示FormGenerator的构造函数和GenerateForm的代码吗?@ScottChamberlain这是一个有点长的代码超过200行,下面是它的屏幕截图。我希望这足够了@我在你链接的页面上尝试了答案,但这两个错误不断出现类型“”不包含“GetMethod”的定义,并且找不到接受类型为“Type”的第一个参数的扩展方法“GetMethod”。是否缺少using指令或程序集引用?无法从“对象”转换为“系统”。键入“您的代码在第二行和第四行给我两个错误。”。实体“是一个变量,但与类型“type”一样使用,它不包含“GetMethod”的定义,并且找不到接受类型“type”的第一个参数的扩展方法“GetMethod”。是否缺少using指令或程序集引用?@YazanWYusuf您可能必须使用System.Reflection添加。如果您在.NETCore上,可能是GetTypeInfo IIRC。