如何通过反射检索字符串并将其连接起来

Pre*_*tor 7 .net vb.net string

我有一个长字符串,使用以下模式分为许多较小的字符串:

Public Class Test
    Public Prefix_1 as String = "1 to 100 bytes"
    Public Prefix_2 as String = "101 to 200 bytes"
    Public Prefix_3 as String = "201 to 300 bytes"
    Public Prefix_4 as String = "301 to 400 bytes"
    'and so on
End Class
Run Code Online (Sandbox Code Playgroud)

Test class已被编译为类库项目(即.dll文件)并保存到C:\ Test.dll

请注意,我不知道Prefix_dll文件中存在多少字符串.

我的问题是:如何检索以启动所有字符串Prefix_通过反射并连接它上升-LY(即Prefix_1&Prefix_2 ...)成一个字符串?

更新赏金:

赏金仅适用于VB.NET解决方案中的答案

age*_*t-j 7

这应该让你开始.对不起,它是C#,但我不记得lambda语法.

     Type type = Assembly.LoadFrom (@"c:\test.dll").GetType ("Test");
     object instance = type.GetConstructor (Type.EmptyTypes).Invoke (null);
     var fields = type.GetFields ().Where (f => f.Name.StartsWith ("Prefix_")).OrderBy(f => f.Name);
     string x = fields.Aggregate (new StringBuilder (), (sb, f) => sb.Append((string)f.GetValue (instance)), sb => sb.ToString ());
Run Code Online (Sandbox Code Playgroud)

VB.NET

  Dim type As Type = Assembly.LoadFrom("c:\test.dll").GetType("Test")
  Dim instance As Object = Type.GetConstructor(Type.EmptyTypes).Invoke(Nothing)
  Dim fields = _
     type.GetFields() _
        .Where(Function(f) f.Name.StartsWith("Prefix_")) _
        .OrderBy(Function(f) f.Name)
  Dim bigString As String = _
     fields.Aggregate(New StringBuilder(), _
                      Function(sb, f) sb.Append(DirectCast(f.GetValue(instance), String)), _
                      Function(sb) sb.ToString())
Run Code Online (Sandbox Code Playgroud)


Col*_*kay 2

您有公共字段,因此,从Type代表类的对象中获取FieldInfo对象并排除名称不以Prefix_

一旦有了这些,您就可以使用GetValueFieldInfo对象(您的 class 实例Test)作为参数来调用对象来获取字段的值。

如果您需要以任何方式对结果进行排序,那么我建议使用 LINQ 语句

抱歉,我不懂VB,否则我会给你写一些代码。

更新:一些 C# 代码

Test myTestInstance = ... // Do stuff to the the instance of your class
Type myType = typeof(Test); // Or call GetType() on an instance
FieldInfo[] myFields = myType.GetFields();
var myPrefixedFields = myFields
                         .Where(fi => fi.Name.StartsWith("Prefix_"))
                         .OrderBy(fi => fi.Name);
string result = string.Empty;
foreach(FieldInfo fi in myPrefixedFields)
{
    // You may prefer to use a string builder.
    result += fi.GetValue(myTestInstance);
}
Run Code Online (Sandbox Code Playgroud)

应该就是这样。