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

Vb.net 如何:在.NET中动态定义属性,vb.net,dynamic,properties,Vb.net,Dynamic,Properties,我已经为FileInfo对象创建了两个比较器类,以允许按名称和LastWriteTime属性排序,但理想情况下,我希望将它们组合到一个类中,这样,我只需通过所选的属性名称就可以按任何属性进行比较/排序 然而,我不知道该怎么做。我的比较器类当前包括: Dim oX As FileInfo = CType(x, FileInfo) Dim oY As FileInfo = CType(y, FileInfo) Dim Result As Int16 = oX.Name.CompareTo(oY.Na

我已经为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))

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

以下是一个示例:

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" '
要将此扩展到比较器场景,您只需要两个变量来保存数据,每个对象一个变量


注意,这比直接访问属性要慢,因此如果您知道在编码将要使用的属性时,您可能会使用
开关
语句来获得更高性能的代码。

以下是一个示例:

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
语句来获得更高性能的代码。

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

   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的人。但是您可以很容易地移植它。

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

   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的人。但是您可以很容易地移植它。

应该更容易使用lambdas@Arnis-是否提供基于Lambda的解决方案?应更易于使用lambdas@Arnis-是否提供基于Lambda的解决方案?