2009-10-08 82 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小时内 - - 感谢