我想将属性名称作为参数传递:
protected T findControl<T>(string myProperty, string myPropertyValue , UITestControl control = null) where T : UITestControl, new()
{
var uiContainer = control ?? Window;
return uiContainer.SearchFor<T>(new { myProperty = myPropertyValue });
}
public static T SearchFor<T>(
this UITestControl control,
dynamic searchProperties,
dynamic filterProperties = null) where T : UITestControl, new()
我用:
return findControl<HtmlComboBox>("id", "PersonComboBox")
当调试时,我得到:
dynamic searchProperties = {myProperty = PersonComboBox}
什么,我想:
dynamic searchProperties = {id = PersonComboBox}
为什么会这样?有办法解决这个问题吗?
答案 0 :(得分:1)
同意Andrew Sun - 动态不是很受欢迎的功能,它的唯一用途是处理COM互操作或使用特殊的API,如Newton.Json,MongoConnector(它也不是很受欢迎 - 大多数开发人员更喜欢他们的Dictionary过载。
如果你想在.net中留下动态的东西 - 最好的办法是使用大多接近JS对象行为的集合和容器。
此任务最常用的类是 - DateTime.strptime('Wednesday', '%A')
# => #<DateTime: 2015-11-18T00:00:00+00:00 ((2457345j,0s,0n),+0s,2299161j)>
DateTime.strptime('10:20:20', '%H:%M:%S')
# => #<DateTime: 2015-11-18T10:20:20+00:00 ((2457345j,37220s,0n),+0s,2299161j)>
(几乎与JS对象完全相同)或Dictionary<string,object>
(如果它真的只是字符串映射而没有嵌套)。
如果你必须提供嵌套 - 你仍然可以使用Dictionary<string,string>
,但在某些情况下,XElement可能是更好的选择。
我不建议使用Newton.JSON而不需要大量的reasone因为它的附加依赖性并且是一种瑞士刀 - 你将只使用它提供的1%的服务。
当认为动态是好的时候 - 记住 - 它只是破解了没有高效的实现,它会导致项目的CSharp依赖性和运行时编译过热。我和我认为很多其他人不建议使用它们而不是非常特殊的情况。
答案 1 :(得分:0)
我同意我以前的发言者的观点,在这里使用字典可能是一个更简单的解决方案,但如果你仍然想在这里使用动态,你可以尝试以下方法:
protected T findControl<T>(string myProperty, string myPropertyValue, UITestControl control = null) where T : UITestControl, new()
{
var uiContainer = control ?? Window;
// create an expando object here and reference it as dictionary
IDictionary<string, object> searchProperties = new ExpandoObject();
// now add your data to the dictionary
searchProperties.Add(myProperty, myPropertyValue);
// call your method with your newly created expando object,
// in your method, you can now call "searchProperties.id"
// and also your debug view (open the "Dynamic View" item in VS debugger)
// should show a property called "id"
return uiContainer.SearchFor<T>(searchProperties);
}