winforms C#反映.设定TableAdapter连接字串

dfty9e19  于 2022-12-04  发布在  C#
关注(0)|答案(1)|浏览(142)

我一直在尝试为Windows Form表单建立新的基底类别。我想要让这个基底类别检查其上的所有Tableadapter,并更新它们的连接字串,而不需要任何人在表单中加入任何程式码。它们只需要将Tableadapter放在表单上,而不用担心连接字串设定,因为所有的设定都是在基底类别中行程。
问题是我的反射代码可以很好地找到该属性,但它不能设置它。我该如何修复它?
下面是代码:

public class cFormWS : Form
{
    public string ConnectionStringToUse { get; set; }

    public cFormWS()
    {
        Load += cFormWS_Load;
    }

    void cFormWS_Load(object sender, EventArgs e)
    {
        InitiliseTableAdapters();
    }

    private void InitiliseTableAdapters()
    {
        var ListOfComponents = EnumerateComponents();

        foreach (var ItemComp in ListOfComponents)
        {
            if (ItemComp.ToString().ToLower().EndsWith("tableadapter"))
            {
                var ItemCompProps = ItemComp.GetType().GetRuntimeProperties();

                var TASQLConnection =
                    ItemCompProps.FirstOrDefault(
                        w => w.PropertyType == typeof(System.Data.SqlClient.SqlConnection));

                if (TASQLConnection != null)
                {
                    var property = typeof(System.Data.SqlClient.SqlConnection).GetProperty("ConnectionString");

                    // How do I set the value?

                    string value = "some new connection string";

                    var ConvertedProperty = Convert.ChangeType(value, property.PropertyType);

                    // I tried seting a value. It is not working:
                    // "object does not match target type"
                    property.SetValue(TASQLConnection, ConvertedProperty, null);

                    //// I tried using a method. It is not working:
                    //// "object does not match target type"
                    //var m = property.SetMethod;
                    //ParameterInfo[] parameters = m.GetParameters();
                    //m.Invoke(m, parameters); // m.Invoke(this, parameters); // m.Invoke(ItemComp, parameters);
                }
            }
        }
    }

    private IEnumerable<Component> EnumerateComponents()
    {
        return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
               where typeof(Component).IsAssignableFrom(field.FieldType)
               let component = (Component)field.GetValue(this)
               where component != null
               select component;
    }
aydmsdu9

aydmsdu91#

当您执行SetValue时,您需要传入您想要在其上设定属性的对象。

  • 在第一个示例代码中,您传入了ItemComp:这是不正确的,因为ConnectionStringSqlConnection的属性,而SqlConnectionItemComp的属性
  • 在您编辑过的问题(以及我最初的答案)中,您传入了TASqlConnection
  • 正确的方法是从ItemComp对象获取值并将其传入:

property.SetValue(TASQLConnection.GetValue(ItemComp), ConvertedProperty, null);
原始(不正确)答案:
您正在尝试设置ItemCompConnectionString属性。ConnectionString不是TableAdapter的属性,而是SqlConnection的属性(SqlConnectionTableAdapter的属性)。
设定属性的正确方式如下:

property.SetValue(TASQLConnection, ConvertedProperty, null);

相关问题