【发布时间】:2019-11-11 19:49:50
【问题描述】:
我定义了一个 DynamicObject。
我创建了一个具有相同结构的 DynamicObjects 列表并将它们链接到 WPF GridView。
我允许通过网格编辑某些属性。
由于 DynamicObjects 将属性数据呈现为对象,我如何强制执行类型限制?
如果用户将字母表输入到我想要作为 int 的单元格中,我怎样才能让 DynamicObject 拒绝输入?
【问题讨论】:
标签: c# dynamicobject
我定义了一个 DynamicObject。
我创建了一个具有相同结构的 DynamicObjects 列表并将它们链接到 WPF GridView。
我允许通过网格编辑某些属性。
由于 DynamicObjects 将属性数据呈现为对象,我如何强制执行类型限制?
如果用户将字母表输入到我想要作为 int 的单元格中,我怎样才能让 DynamicObject 拒绝输入?
【问题讨论】:
标签: c# dynamicobject
无论您在哪里进行单元格输入,都可以使用TryParse:
int result;
if(int.TryParse(cellText, out result))
{
// Is an integer
}
else
{
}
bool 和其他值类型也有 TryParse,如果您也采用这些值。
另见:
【讨论】:
在我的 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;
}
}
【讨论】: