我已经为PostSharp开发了一个自定义方面,该方面过去可以正常工作,但是由于我更新了项目以使用最新的PostSharp NuGet而失败了。方面如下:
[HasConstraint]
public sealed class NotDefaultAttribute : LocationContractAttribute, ILocationValidationAspect<ValueType>, ILocationValidationAspect, IAspect
{
public NotDefaultAttribute()
{
ErrorMessage = "The {2} cannot be empty.";
}
public Exception ValidateValue(ValueType value, string locationName, LocationKind locationKind)
{
if (value == null)
return null;
var type = value.GetType();
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
{
if (value.Equals(Activator.CreateInstance(type.GetGenericArguments()[0])))
return CreateArgumentException(value, locationName, locationKind);
}
else if (value.Equals(Activator.CreateInstance(type)))
return CreateArgumentNullException(value, locationName, locationKind);
return null;
}
}
该方面的示例用法是:
public class Example
{
[NotDefault]
public DateTime Timestamp { get; set; }
}
如本例所示,当代码尝试设置属性时...
new Example().Timestamp = DateTime.UtcNow;
...我得到以下
MissingMethodException
:System.MissingMethodException: Method not found: 'System.Exception NotDefaultAttribute.ValidateValue(System.ValueType, System.String, PostSharp.Reflection.LocationKind)'.
at Example.set_Timestamp(DateTime value)
将PostSharp降级到3.0.36可解决此问题。但是,这并不是真正的选择,因为我们要切换到要求3.0.38或更高版本的.NET 4.5.1。 (更不用说,卡在旧版本上很痛苦。)
最佳答案
PostSharp版本3.1.27已实现对所描述用例的支持。
从该版本开始,可以在任何值类型属性上应用方法ValidateValue(ValueType value, ...)
的验证方面。
关于c# - PostSharp提供MissingMethodException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19531792/