gpt4 book ai didi

c# - 自定义属性和 GetCustomAttributes 的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 21:39:38 25 4
gpt4 key购买 nike

我已经与这个问题斗争了几个小时,但我找不到任何关于 SO(或谷歌)的相关信息。

这是我的问题:
我有一个包含对象数组属性的自定义属性。

[System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple = false)]
public class Property : System.Attribute
{
public object[] Parameters { get; set; }

public JsonProperty(object[] prms = null)
{
Parameters = prms;
}
}

然后我使用以下代码从属性中读取它:
var customProperties = (Property[])currentProperty.GetCustomAttributes(typeof(Property), false);

这一切都适用于以下情况:
[Property(Parameters = new object[]{}]
<...property...>

但是,如果我将其设置为 null ([Property(Parameters = null]) ,我收到此错误:
System.Reflection.CustomAttributeFormatException:
'Parameters' property specified was not found.

这是荒谬的,因为该属性是在我的自定义属性中定义的。我真的不明白。

所以我的问题是:发生了什么?

- 编辑

如果我将属性的类型从 object[] 更改为 object,则分配 null 效果很好。

--编辑添加代码

属性:
[System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple = false)]
public class JsonProperty : System.Attribute
{
public object[] Parameters { get; set; }

public JsonProperty(object[] prms = null)
{
Parameters = prms;
}
}

类(class):
public class MyClass
{
[JsonProperty(Parameters = null)]
public DateTime Start { get; set; }
}

方法:
public string getAttributes()
{
Type t = MyClass.GetType();

// Get only public properties and that have been set.
var properties = t.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(prop => prop.GetValue(this, null) != null);

foreach (var prop in properties)
{
//The error occur on the next line.
var jsonProperties =
(JsonProperty[])prop.GetCustomAttributes(typeof(JsonProperty), false);

--如果你不明白,请尝试阅读以下内容:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/ddebbec6-1653-4502-9802-0b421efec60d/an-unexplicable-customattributeformatexception-from-getcustomattributes?forum=csharpgeneral

我也在那里问过这个问题。

最佳答案

我知道旧帖子,但有一个解决方法。我在使用反射和自定义属性时遇到了类似的问题。如果它是 Null,我更改了属性以更新设置值,如下所示。

public object[] Parameters { get; set; }

改为:
private object[] _Parameters = new object[0];

public object[] Parameters {
get {
return _Parameters;
}
set {
_Parameters = value ?? new object[0];
}
}

所以现在,即使您分配 Null 或未能分配一个值,它也会起作用,但如果您希望跳过该属性(如果它被设置为 Null),您可能需要在其他地方更新您的逻辑。

同样在我的情况下,这是在处理 int[] 数组而不是 object[] 时。

关于c# - 自定义属性和 GetCustomAttributes 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26686523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com