Vb.net 如何:在.NET中动态定义属性
我已经为FileInfo对象创建了两个比较器类,以允许按名称和LastWriteTime属性排序,但理想情况下,我希望将它们组合到一个类中,这样,我只需通过所选的属性名称就可以按任何属性进行比较/排序 然而,我不知道该怎么做。我的比较器类当前包括: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
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的解决方案?