我正在将数据集转换为动态集合并绑定它,这工作正常。现在我需要添加一个对集合为空的新对象。我正在尝试的是获取datagrid的ItemsSource并获取列表中的第一个对象。但它内部有一些价值。如何删除值并使用反射绑定空对象。
这是我的代码,
IEnumerable<object> collection = this.RetrieveGrid.ItemsSource.Cast<object>();
List<object> list = collection.ToList();
//i need to clear the values inside list[0]
object name = list[0];
//here i build the properties of the object, now i need to create an empty object using these properties and add it to the list
PropertyInfo[] pis = list[0].GetType().GetProperties();
答案 0 :(得分:2)
如果你的未知类型有一些已知的构造函数,那么你可以使用反射来实例化它。
// gets the Type
Type type = list[0].GetType();
// gets public, parameterless constructor
ConstructorInfo ci = type.GetConstructor(new Type[0]);
// instantiates the object
object obj = ci.Invoke(new object[0]);
显然,当你没有一个简单的无参数构造函数时,它将无法工作。如果您知道类构造函数总是采用某个参数,例如整数值,那么您可以使用new Type[] { typeof(int) }
和new object[] { someIntValue }
修改上面的代码段。
但这是否会创造一个空的&#34;对象与否取决于构造函数的行为。
如果您想要设置一些属性,可以通过调用PropertyInfos
来迭代type.GetProperties()
,并使用适当的值调用SetValue
。
答案 1 :(得分:1)
调用Activator.CreateInstance
创建新实例。然后使用PropertyInfo.SetValue
将字符串字段设置为空。
Type requiredType = list[0].GetType();
object instance = Activator.CreateInstance(requiredType);
PropertyInfo[] pis = requiredType.GetProperties();
foreach (var p in pis)
{
if (p.PropertyType == typeof(string))
{
p.SetValue(instance, string.Empty);
}
}
请注意,如果类型没有无参数构造函数,Activator.CreateInstance
会抛出异常。
答案 2 :(得分:0)
获取该对象的类型并创建新对象,并将其添加到 列表,列表[0]
编写一个函数,传递此对象,获取其类型,清除单个属性, 如果您知道它包含哪些属性