我有一個自定義對象(例如只爲了便於理解代碼)...從字符串訪問對象屬性申述
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 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 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;
}
}
}
...但最好我想在下面的屬性的類型轉換(字符串,整數等)和使用不同數量的委託調用類型進行排序。我環顧四周,但我沒有找到任何指向正確方向的東西。我看了看反射,但看不到任何能夠幫助我的東西。
這甚至可能嗎?如果是這樣,怎麼樣?!
乾杯!
你不能使用常規的,非通用的Comparer這需要對象作爲參數? – 2009-01-26 14:46:18
可能。不能說我曾經使用非通用形式 - 甚至不知道它的存在! – 2009-01-26 14:54:02