2009-10-08 78 views
1

動態定義的屬性我已經創建了FileInfo的對象一對夫婦的Comparer類,允許通過名稱和LastWriteTime屬性進行排序,但最好我想將它們合併爲一次課,讓我可以通過簡單地通過選擇的屬性名稱來比較/排序任何屬性。HOW TO:在.NET

不過,我不知道如何去了解這一點。我的比較器類當前包括:

Dim oX As FileInfo = CType(x, FileInfo) 
Dim oY As FileInfo = CType(y, FileInfo) 
Dim Result As Int16 = oX.Name.CompareTo(oY.Name) 

我希望能夠使用存儲在_sortColumn變量中的屬性名稱替換Name屬性。

我期待的解決方案是很簡單的,但至今,我一直沒能弄明白!

解決方案:

我已經得到儘可能研究的反思,和整個的PropertyInfo迷迷糊糊。但Fredriks解決方案砍下我的搜索,並提供了位結構,我想出了這個(VB.Net)解決方案,這似乎很好地工作:

 Dim oX_PI As PropertyInfo = CType(x, FileInfo).GetType.GetProperty(_sortColumn) 
    Dim oY_PI As PropertyInfo = CType(y, FileInfo).GetType.GetProperty(_sortColumn) 
    Dim Result As Int16 = oX_PI.GetValue(x, Nothing).CompareTo(oY_PI.GetValue(x, Nothing)) 

在現實中,我只有兩列爲了處理這個問題,我可以稍微更加明確一些,而且性能更高。但是,這是一個學習工具,因爲它是一個現實世界的問題,所以我追求這個更復雜的解決方案。

回答

3

下面是如何做一個例子:

Dim propertyName As String = "Extension" 
Dim fi As New FileInfo("C:\WINDOWS\explorer.exe") 
Dim pi As PropertyInfo =GetType(FileInfo).GetProperty(propertyName) 
Dim data As Object = pi.GetValue(fi, Nothing) ' data will be the string ".exe" ' 

要擴展這一個比較器的情況下,你只需要兩個變量用於保存數據,每一個對象。

請注意,這比直接訪問屬性要慢,所以如果您知道何時編碼您將使用的屬性,則可能會使用switch語句代替更多的高性能代碼。

+0

應該使用lambda表達式 – 2009-10-08 12:09:26

+0

@Fredrik容易。 – CJM 2009-10-08 13:40:02

+0

@Arnis - 謹慎提供基於Lambda的解決方案? – CJM 2009-10-08 13:52:44

2

您可以使用擴展方法來實現這一目標。

public static class ExtensionMethods 
{ 
    public static bool compare(this FileInfo F1,FileInfo F2,string propertyName) 
    { 
     try 
     { 
      System.Reflection.PropertyInfo p1 = F1.GetType().GetProperty(propertyName); 
      System.Reflection.PropertyInfo p2 = F2.GetType().GetProperty(propertyName); 

      if (p1.GetValue(F1, null) == p2.GetValue(F1, null)) 
      { 
       return true; 
      } 

     } 
     catch (Exception ex) 
     { 
      return false; 
     } 

     return false; 
    } 
} 

你可以這樣調用

System.IO.FileInfo fo = new System.IO.FileInfo("c:\\netlog.txt"); 
    System.IO.FileInfo f1 = new System.IO.FileInfo("c:\\regkey.txt"); 
    var isTrue = fo.compare(f1, "DirectoryName"); 

的方法啊,這是一個C#代碼。對不起,我不是一個男生。但你可以輕鬆移植這個。兩次24小時內 - - 感謝