【问题标题】:WPF c# DynamicObject. how to enforce type checking on the added properties?WPF c# 动态对象。如何对添加的属性进行类型检查?
【发布时间】:2019-11-11 19:49:50
【问题描述】:

我定义了一个 DynamicObject。

我创建了一个具有相同结构的 DynamicObjects 列表并将它们链接到 WPF GridView。

我允许通过网格编辑某些属性。

由于 DynamicObjects 将属性数据呈现为对象,我如何强制执行类型限制?

如果用户将字母表输入到我想要作为 int 的单元格中,我怎样才能让 DynamicObject 拒绝输入?

【问题讨论】:

    标签: c# dynamicobject


    【解决方案1】:

    无论您在哪里进行单元格输入,都可以使用TryParse

    int result;
    if(int.TryParse(cellText, out result))
    {
       // Is an integer              
    }
    else
    {
    
    }
    

    bool 和其他值类型也有 TryParse,如果您也采用这些值。

    另见:

    【讨论】:

      【解决方案2】:

      在我的 DynamicObject 的构造函数中,我传入了属性定义,即类型的字典。

      然后我重写 TrySetMember 方法,将网格提供的字符串中的值转换为所需的类型。

      如果转换失败,我现在遇到的问题是向网格发送错误消息。

      这是我的 DynamicObject 定义:

      public sealed class FwDynamicObject : DynamicObject
      {
          private readonly Dictionary<string, object> _properties;
          private readonly Dictionary<string, Type> _propertyTypes;
      
          public FwDynamicObject(Dictionary<string, object> properties, Dictionary<string, Type> propertyTypes = null)
          {
              _properties = properties;
              _propertyTypes = propertyTypes;
          }
      
          public override IEnumerable<string> GetDynamicMemberNames()
          {
              return _properties.Keys;
          }
      
          public override bool TryGetMember(GetMemberBinder binder, out object result)
          {
              if (_properties.ContainsKey(binder.Name))
              {
                  result = _properties[binder.Name];
                  return true;
              }
              else
              {
                  result = null;
                  return false;
              }
          }
      
          public override bool TrySetMember(SetMemberBinder binder, object value)
          {
              if (_properties.ContainsKey(binder.Name))
              {
                  var t = GetMemberType(binder.Name);
                  if (t != null)
                  {
                      try
                      {
                          value = Convert.ChangeType(value, t);
                      }
                      catch(Exception e)
                      {
                          return false;
                      }
                  }
      
                  _properties[binder.Name] = value;
                  return true;
              }
              else
              {
                  return false;
              }
          }
      
          private Type GetMemberType(string name)
          {
              if (_propertyTypes.ContainsKey(name))
              {
                  return _propertyTypes[name];
              }
              return null;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 1970-01-01
        • 2022-09-27
        • 2011-10-25
        • 2017-03-04
        相关资源
        最近更新 更多