C# 反射.设置表适配器连接字符串



我一直在尝试为 Windows 窗体创建一个新的基类。 我想让这个基类遍历它上面的所有表适配器并更新它们的连接字符串,而无需任何人向表单添加任何代码。 他们只是将表适配器放在窗体上,而不用担心连接字符串设置,因为它们都在基类中处理。

问题是我的反射代码可以找到该属性,但它无法设置它。我该如何解决它?

下面是代码:

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;
    }

当你执行SetValue时,你需要传入你想要设置属性的对象。

  • 在您的第一个示例代码中,您传入了 ItemComp : 这是不正确的,因为ConnectionStringSqlConnection的属性,而是 ItemComp 的属性
  • 在您编辑的问题(和我的原始答案(中,您通过了TASqlConnection.但是,这不是对象,而是基于对象的PropertyInfo
  • 正确的方法是从ItemComp对象中获取值并将其传入:

property.SetValue(TASQLConnection.GetValue(ItemComp), ConvertedProperty, null);

原始(错误(答案:

您正在尝试将ConnectionString属性设置为 ItemComp 。连接字符串不是TableAdapter的属性,而是SqlConnection的属性(TableAdapter的属性(。

设置属性的正确方法是:

property.SetValue(TASQLConnection, ConvertedProperty, null);

相关内容

  • 没有找到相关文章

最新更新