我一直在尝试为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;
}
1条答案
按热度按时间aydmsdu91#
当您执行
SetValue
时,您需要传入您想要在其上设定属性的对象。ItemComp
:这是不正确的,因为ConnectionString
是SqlConnection
的属性,而SqlConnection
是ItemComp
的属性TASqlConnection
。ItemComp
对象获取值并将其传入:property.SetValue(TASQLConnection.GetValue(ItemComp), ConvertedProperty, null);
原始(不正确)答案:
您正在尝试设置
ItemComp
的ConnectionString
属性。ConnectionString不是TableAdapter
的属性,而是SqlConnection
的属性(SqlConnection
是TableAdapter
的属性)。设定属性的正确方式如下: