如何使用循环更改名称相似的内部类?

时间:2019-06-14 16:09:48

标签: c# class inner-classes ranorex

此问题特定于Ranorex Android移动开发人员,它限制了我设置类的方式,但是通用的C#解决方案也可以帮助我。

我一直试图找到一种方法来切换仅稍有不同的内部类。如果有一种方法可以在类名中包含一个变量,那会很好,但是我很难找到它的任何来源。目前,我在if语句(我可以将其更改为switch,但这不是我想要的解决方案)中硬编码了8种不同的变体,基本上如下。

if (device_name == d1_name)
{
    device_stats.Add("Device Name", d1_name);
    System.Diagnostics.Debug.WriteLine(device_stats["Device Name"]);
    device_stats.Add("Status", repo.Android.Settings.d1.deviceStatus.TextValue);
    System.Diagnostics.Debug.WriteLine("Status:\t" + device_stats["Status"]);

    repo.Android.Settings.d1.screen.Touch();
}
else if(device_name == d2_name)
{
    device_stats.Add("Device Name", d2_name);
    System.Diagnostics.Debug.WriteLine(device_stats["Device Name"]);
    device_stats.Add("Status", repo.Android.Settings.d2.deviceStatus.TextValue);
    System.Diagnostics.Debug.WriteLine("Status:\t" + device_stats["Status"]);

    repo.Android.Settings.d2.screen.Touch();
}
else if (device_name == d3_name)
{
    device_stats.Add("Device Name", d3_name);
    System.Diagnostics.Debug.WriteLine(device_stats["Device Name"]);
    device_stats.Add("Status", repo.Android.Settings.d3.deviceStatus.TextValue);
    System.Diagnostics.Debug.WriteLine("Status:\t" + device_stats["Status"]);

    repo.Android.Settings.d3.screen.Touch();
}

如您所见,大小写之间唯一的区别是设备名称。我一直在尝试找到一种方法,可以遍历一小段代码,并用迭代器替换d'#'。像这样的东西。

for (i_device = 0; i_device < n_device; i_device++)
{
    string i_str = int2str(i_device);
    if(device_name == device_name_arr[i_device])
    {
        device_stats.Add("Device Name", device_name_arr[i_device]));
        System.Diagnostics.Debug.WriteLine(device_stats["Device Name"]);
        device_stats.Add("Status", repo.Android.Settings.StringToInnerClass("d" + i_str).deviceStatus.TextValue);
        System.Diagnostics.Debug.WriteLine("Status:\t" + device_stats["Status"]);

        repo.Android.Settings.StringToInnerClass("d" + i_str).screen.Touch();
    }
}

我不认为有一种方法可以在类调用中包含一个函数,所以我想知道是否已经将某种类存储在数组中了?我不确定没有某种编码魔术就可以做到这一点。

更新

我开始构建超越我的东西,我什至不确定目前是否正确。我认为我可以对这部分进行硬编码,而不是提出疯狂的解决方案。如果您有兴趣,这就是我要去的地方。 (有些类是自动生成的,有点奇怪)。它甚至无法编译

List<TestRepositoryFolders> device_folder = new List<TestRepositoryFolders>();
device_folder.Add(D5Folder.repo.Android.Settings.d5);
device_folder.Add(D6Folder.repo.Android.Settings.d6);

System.Diagnostics.Debug.WriteLine("please" + (TestRepositoryFolders)device_folder[0].deviceName.TextValue);
System.Diagnostics.Debug.WriteLine("please" + (TestRepositoryFolders)device_folder[1].deviceName.TextValue);

2 个答案:

答案 0 :(得分:1)

可以将您在代码中拥有的StringToInnerClass编写为扩展方法,该方法使用反射来获取所需的特定于设备的设置对象,尽管在这种情况下这样做可能会过大

循环是个好主意。假设d1d2等具有相同的类型,可以将设备名称的数组扩展为名称/功能对的数组,以实现您的目标。

首先为设备构造元数据:该元数据由设备名称和设置检索功能组成。我在这里使用元组来避免现在定义类型,但是您最终应该考虑这样做。

由于您没有回答有关类型名称的问题,因此假设repo.Android.Settings的类型为AndroidSettings。根据您的编辑,d1等似乎是TestRepositoryFolders类型。要使它们正常工作,请根据需要将其更改为实际类型。

List<(string Name, Func<AndroidSettings, TestRepositoryFolders> GetDeviceSettings)> device_meta =
    new List<(string, Func<AndroidSettings, TestRepositoryFolders>)>()
{
    (d1_name, s => s.d1),
    (d2_name, s => s.d2),
    (d3_name, s => s.d3)
};

然后更改循环,以使用Name属性测试设备名称,并使用GetDeviceSettings属性获取该设备的设置。比赛一旦结束,您就可以摆脱循环。

for (int i_device = 0; i_device < device_meta.Count; i_device++)
{
    if (device_name == device_meta[i_device].Name)
    {
        device_stats.Add("Device Name", device_meta[i_device].Name));
        System.Diagnostics.Debug.WriteLine(device_stats["Device Name"]);

        var deviceSettings = device_meta[i_device].GetDeviceSettings();

        device_stats.Add("Status", deviceSettings.deviceStatus.TextValue);
        System.Diagnostics.Debug.WriteLine("Status:\t" + device_stats["Status"]);

        deviceSettings.screen.Touch();

        break;
    }
}

您可能会遇到其他需要遍历设备并进行其他操作的地方。那将是时候(如果不是更快的话)将元组转换为您自己制作的类型,并包括执行该操作所需的新元数据。

答案 1 :(得分:1)

听起来您想要做的就是我们所说的类型反射。

var device = typeof(repo.Android.Settings).GetField("d" + i, BindingFlags.Public | BindingFlags.Static).GetValue(null) as TestRepositoryFolders

此方法较难阅读,但一旦添加新设备,就无需更改。

相关问题