代码之家  ›  专栏  ›  技术社区  ›  CJM

如何:在.NET中动态定义属性

  •  1
  • CJM  · 技术社区  · 15 年前

    我已经为FileInfo对象创建了两个比较器类,以允许按名称和LastWriteTime属性排序,但理想情况下,我希望将它们组合到一个类中,这样,我只需通过所选的属性名称就可以按任何属性进行比较/排序。

    然而,我不知道该怎么做。我的比较器类当前包括:

    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))
    

    实际上,我只有两个专栏要处理,所以我可以稍微更明确一点,表现得更好。但这既是一个学习工具,也是一个现实世界的问题,所以我一直在寻求更复杂的解决方案。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Fredrik Mörk    15 年前

    下面是一个如何执行的示例:

    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

        2
  •  2
  •   RameshVel    15 年前

    您可以使用扩展方法来实现这一点。

       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代码。对不起,我不是vb的人。但是你可以很容易地移植这个。