String作为新运算符的泛型参数

时间:2015-11-18 15:24:33

标签: c# .net generics

我想将属性名称作为参数传递:

   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}

为什么会这样?有办法解决这个问题吗?

2 个答案:

答案 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);
}