编写某种通用方法

时间:2011-12-20 15:05:32

标签: c#

我有一系列的写法,但我认为有一些共性(嗯,我知道有)。我想看的方法将采取两件事,一个对象......好吧,我不太确定第二个,但可能是一个字符串。

该对象应该是通用的,尽管它只能来自一个集合列表(在这种情况下,它的共性似乎是它们从INotifyPropertyChanging和INotifyPropertyChanged接口继承)。

字符串应该是通用对象中属性的名称。应该检查该属性是否存在于该对象之前(它将用作比较给定属性的对象的方法)。

所以我猜这个过程是......将泛型对象传递给方法(以及属性名称字符串)。检查对象是否包含属性。如果是,继续并以某种方式访问​​'object.PropertyName',其中'PropertyName'是提供的字符串。

我不知道这是否容易,可能甚至是明智的,但我知道这会节省一些时间。

提前感谢您提供的任何建议。

编辑:感谢所有回复到目前为止。让我澄清一些事情:

澄清“访问权”

当我说,“......并且以某种方式可以访问'object.PropertyName'”时,我的意思是该方法应该能够使用该属性名称,就好像它只是该对象的属性一样。所以,让我们说传入的字符串是“ClientName”,将有能力读取(可能写入,虽然目前我不认为这只是一个检查)object.ClientName,如果确定存在

我正在尝试做什么

我有一个使用Linq访问SQL数据库的WCF服务。我所说的对象是从程序SQLMetal.exe生成的实体,所以我的对象就像'Client','User'这样的东西。我写了一个采用实体列表的方法。此方法仅添加了集合中不存在的实体(有些可能是重复的)。它通过检查实体中的属性(对应于数据库列中的数据)来确定哪些是重复的。这个属性我认为可能是变量。

2 个答案:

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