我有一个自定义对象(为了便于理解,仅示例代码)...
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/