繁体   English   中英

在运行时将 class 名称(不是实例化对象)作为方法参数传递

[英]Pass a class name (not an instantiated object) as method parameter during runtime

不知道这是否可行,但我需要将 class 名称(我拥有的数百个名称之一)作为参数传递给方法。 每个 class 都是一个包含我正在填充的字段的表单。 我在一个名为 Forms 的常见 class 中有常用方法。 我想要做的是将 class 名称(表单)传递给 Forms class 中的方法,然后实例化数据,然后调用 AddData() 方法。 我发现的所有内容都与 Activator.CreateInstance(Type t) 相关,但它返回的 Type object 无法调用 AddData() 方法。

工艺流程:

  1. 从 UI 调用 FillForm.AutoFill() 以获取所选表单(类名)。
  2. 调用 Form.AddData() 实例化表单并传入从 SQL 和 UI 表单字段检索到的数据。
  3. 将完成的表单返回到 UI。

我想做的是,当在 UI(SQL 表单列表)上选择表单时,它将 class 名称传递给 FillForm,它执行如下操作:

var form = new Form<T>()
var fdata = await form.AddData(GetSqlData(user), inputData)
//AddData uses the appropriate form class
SaveDocument(fdata); 

但我不确定如何在 Forms 中实现它。

我真的不想使用 switch 语句,因为它最多可以有 600 个案例并且不可扩展。

任何想法将不胜感激。

介绍了以下两种模式。

1. 使用 AddData 方法创建一个接口。

public interface IGoodForm
{
    DataTable AddData(DataTable sqlData, DataTable inputData);
}

在每个表单上实现 IGoodForm 接口。

 public partial class GoodForm : Form, IGoodForm
{
    ~~~

    public DataTable AddData(DataTable sqlData, DataTable inputData)
    {
        var result = new DataTable();

        return result;
    }
    
    ~~~
}

调用以下过程。

var dataTable = new DataTable();
var inputData = new DataTable();

var type1 = Type.GetType("Namespace.GoodForm");
var instance1 = Activator.CreateInstance(type1) as IGoodForm;
var result1 = instance1.AddData(dataTable, inputData);

不需要接口,调用下面的处理。

var dataTable = new DataTable();
var inputData = new DataTable();

var type2 = Type.GetType("Namespace.GoodForm");
var instance2 = Activator.CreateInstance(type2);
var param2 = new object[] { dataTable, inputData };
var result2 = type2.GetMethod("AddData").Invoke(instance2, param2);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM