c# - 从字符串表示访问对象属性

标签 c# generics reflection sorting

我有一个自定义对象(为了便于理解,仅示例代码)...

public class MyClass
{
    private string name;
    private int increment;
    private Guid id;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int Increment
    {
        get { return increment; }
        set { increment = value; }
    }

    public Guid Id
    {
        get { return id; }
        set { id = value; }
    }
}

...以及此类的自定义集合...

public class MyClassCollection : Collection<MyClass>
{

}

我想为集合编写一个排序例程,它将具有以下公共(public)方法......

    public void Sort(params string[] sortProperties)
    {
        if (sortProperties == null)
        {
            throw new ArgumentNullException("sortProperties", "Parameter must not be null");
        }

        if ((sortProperties.Length > 0) && (Items.Count > 1))
        {
            foreach (string s in sortProperties)
            {
        // call private sort method
                Sort(s);
            }
        }
    }

... 私有(private) Sort 方法将采用属性名称的参数 ...

    private void Sort(string propertyName)
    {

    }

我想做的是能够将一组属性名称传递到方法中......

        MyClassCollection current = new MyClassCollection();

        // setup a objects in the collection
        current = GetCollectionData();

        // sort by Name, then by Increment
        current.Sort("Name", "Increment");

使用传递到方法中的属性名称,我希望能够检查它是否具有该名称的属性,如果有,则找出它是什么类型,然后运行它。

我目前得到的临时解决方法是......

    private void Sort(string propertyName)
    {
        // convert to List
        List<MyClass> myCurrentClass = Items as List<MyClass>;

        // sort
        if (myCurrentClass != null)
        {
            switch (propertyName)
            {
                case "Name":
                    myCurrentClass.Sort(delegate(MyClass myClassOne, MyClass myClassTwo)
                                 {
                                     return
                                         Comparer<string>.Default.Compare(myClassOne.Name,
                                                                          myClassTwo.Name);
                                 }
                        );
                    break;

                case "Increment":
                    myCurrentClass.Sort(delegate(MyClass myClassOne, MyClass myClassTwo)
                                 {
                                     return
                                         Comparer<int>.Default.Compare(myClassOne.Increment,
                                                                       myClassTwo.Increment);
                                 });
                    break;
            }
        }
    }

...但理想情况下,我想打开属性的基础类型(字符串、整数等),并对类型使用不同数量的委托(delegate)调用来进行排序。我环顾四周,但没有发现任何指向正确方向的东西。我看过反射,但看不到任何可以帮助我的东西。

这可能吗?如果是这样,怎么做?!

干杯!

最佳答案

反射将是可行的方法 - 查看 Type.GetProperty(string name)。之后创建正确的比较器可能会很棘手——您可能想要编写一个通用方法,然后根据属性类型通过反射调用它。恐怕这一切都变得非常恶心 - 但它绝对可行。

关于c# - 从字符串表示访问对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/479966/

相关文章:

c# - 有谁知道为什么我会收到 HttpWebRequest 超时?

java - 互补的泛型类型

java - 在我的例子中,启动服务(按类)返回 null

C# 使用 Activator.CreateInstance

c# - WCF 自定义验证器 : How to initialize a "User" object from custom validator

c# - 尝试插入两个字母的字符时,指定的转换无效

java - 未经检查的转换警告

反射(reflect)类型时,Swift Mirror Children集合为空

c# - 如何从 WCF 服务返回图像?

java - 如何引用内部类成员的泛型类型?