我有一系列的写法,但我认为有一些共性(嗯,我知道有)。我想看的方法将采取两件事,一个对象......好吧,我不太确定第二个,但可能是一个字符串。
该对象应该是通用的,尽管它只能来自一个集合列表(在这种情况下,它的共性似乎是它们从INotifyPropertyChanging和INotifyPropertyChanged接口继承)。
字符串应该是通用对象中属性的名称。应该检查该属性是否存在于该对象之前(它将用作比较给定属性的对象的方法)。
所以我猜这个过程是......将泛型对象传递给方法(以及属性名称字符串)。检查对象是否包含属性。如果是,继续并以某种方式访问'object.PropertyName',其中'PropertyName'是提供的字符串。
我不知道这是否容易,可能甚至是明智的,但我知道这会节省一些时间。
提前感谢您提供的任何建议。
编辑:感谢所有回复到目前为止。让我澄清一些事情:
澄清“访问权”
当我说,“......并且以某种方式可以访问'object.PropertyName'”时,我的意思是该方法应该能够使用该属性名称,就好像它只是该对象的属性一样。所以,让我们说传入的字符串是“ClientName”,将有能力读取(可能写入,虽然目前我不认为这只是一个检查)object.ClientName,如果确定存在
我正在尝试做什么
我有一个使用Linq访问SQL数据库的WCF服务。我所说的对象是从程序SQLMetal.exe生成的实体,所以我的对象就像'Client','User'这样的东西。我写了一个采用实体列表的方法。此方法仅添加了集合中不存在的实体(有些可能是重复的)。它通过检查实体中的属性(对应于数据库列中的数据)来确定哪些是重复的。这个属性我认为可能是变量。
答案 0 :(得分:1)
我认为你正在寻找类似的东西:
public void SomeMethod<T>(T object, string propName)
where T : INotifyPropertyChanging, INotifyPropertyChanged
(
var type = typeof(T);
var property = type.GetProperty(propName);
if(property == null)
throw new ArgumentException("Property doesn't exist", "propName");
var value = property.GetValue(object, null);
)
答案 1 :(得分:1)
听起来你真的不想检查它是否是某种类型,如果是这样,那么你就不必这样做了,实际上更容易不检查类型。这显示了如何检查属性是否存在以及它是否可读和可写,并说明如何在找到它之后使用它:
private void Form1_Load(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
PropertyInfo info = GetProperty(sb, "Capacity");
//To get the value of the property, call GetValue on the PropertyInfo with the object and null parameters:
info.GetValue(sb, null);
//To set the value of the property, call SetValue on the PropertyInfo with the object, value, and null parameters:
info.SetValue(sb, 20, null);
}
private PropertyInfo GetProperty(object obj, string property)
{
PropertyInfo info = obj.GetType().GetProperty(property);
if (info != null && info.CanRead && info.CanWrite)
return info;
return null;
}
我认为只有索引器属性才能在C#中获取参数。我相信如果你在VB中编写属性来获取参数并尝试在C#中引用该程序集,它们将显示为方法而不是属性。
您还可以编写一个这样的函数,它将获取2个对象和一个属性名称的字符串,并返回匹配的属性的结果:
private bool DoObjectsMatch(object obj1, object obj2, string propetyName)
{
PropertyInfo info1 = obj1.GetType().GetProperty(propertyName);
PropertyInfo info2 = obj2.GetType().GetProperty(propertyName);
if (info1 != null && info1.CanRead && info2 != null && info2.CanRead)
return info1.GetValue(obj1, null).ToString() == info2.GetValue(obj2, null).ToString();
return false;
}
比较属性的值可能很棘手,因为它会将它们作为对象进行比较,并且知道如何为它们处理相等性。但在这种情况下,将值转换为字符串应该适合您。
如果您知道2个对象的类型相同,那么您可以简化它:
private bool DoObjectsMatch(object obj1, object obj2, string propetyName)
{
PropertyInfo info = obj1.GetType().GetProperty(propertyName);
if (info != null && info.CanRead)
return info.GetValue(obj1, null).ToString() == info.GetValue(obj2, null).ToString();
return false;
}