调用 TypeDescriptor.RemoveProviderTransparent 无效

runerback 2016-02-01 04:48:07
首先通过 TypeDescriptor.AddProviderTransparent 添加一个说明类,在方法结尾处移除说明类,结果下次再添加之后绑定的还是第一次绑定的,怎么办?


public static string ValidateModel<MetadataType>(this object instance)
{
var targetType = instance.GetType();
var typeProvider = new AssociatedMetadataTypeTypeDescriptionProvider(targetType, typeof(MetadataType));
try
{
if (targetType != typeof(MetadataType))
{
TypeDescriptor.AddProviderTransparent(typeProvider, targetType);
}
var validationContext = new ValidationContext(instance, null, null);
var validationResults = new List<ValidationResult>();

Validator.TryValidateObject(instance, validationContext, validationResults);

if (validationResults.Count > 0)
{
return validationResults.First().ErrorMessage;
}
else
{
return string.Empty;
}
}
catch (Exception ex)
{
return ex.Message;
}
finally
{
TypeDescriptor.RemoveProviderTransparent(typeProvider, targetType);
}
}

具体代码是参考 MVVM模式下的输入校验 写的,但是他的方法只能进行单个属性的验证,而我需要根据一个属性的所选的值来验证另一个属性,所以需要把整个对象传进去。无奈绑定过一次之后再就无法绑定其他的了。

有知道的吗?
...全文
177 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
runerback 2016-03-11
  • 打赏
  • 举报
回复
官方文档上说要加个Attribute,但并没什么用。
问题是在看到CustomValidator源代码中的两行注释后解决的,分享一下:



runerback 2016-02-02
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
Use the AddProvider(TypeDescriptionProvider, Type) method if you do not need to call from partially trusted code.
但是 AddProvider 问题依旧
Poopaye 2016-02-01
  • 打赏
  • 举报
回复
AddProviderTransparent Remarks This method can be called from partially trusted code. If RestrictedRegistrationAccess is defined, the caller can register a provider for the specified type if it is also partially trusted. Use the AddProvider(TypeDescriptionProvider, Type) method if you do not need to call from partially trusted code.
runerback 2016-02-01
  • 打赏
  • 举报
回复
但是这样是有效的:

if (targetType != typeof(MetadataType))
{
    TypeDescriptor.AddProvider(typeProvider, targetType);
    TypeDescriptor.RemoveProvider(typeProvider, targetType);
}
后面的验证方法不再触发,证明确实是移除掉关联类了。 为什么在执行了 Validator.TryValidateObject 之后就无法移除了呢?

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧