此问题特定于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);
答案 0 :(得分:1)
您可以将您在代码中拥有的StringToInnerClass
编写为扩展方法,该方法使用反射来获取所需的特定于设备的设置对象,尽管在这种情况下这样做可能会过大
循环是个好主意。假设d1
,d2
等具有相同的类型,可以将设备名称的数组扩展为名称/功能对的数组,以实现您的目标。
首先为设备构造元数据:该元数据由设备名称和设置检索功能组成。我在这里使用元组来避免现在定义类型,但是您最终应该考虑这样做。
由于您没有回答有关类型名称的问题,因此假设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
此方法较难阅读,但一旦添加新设备,就无需更改。