首页 > 后端开发 > C++ > 如何在 C# 中动态地将属性分配给属性而不出现'集合具有固定大小”异常?

如何在 C# 中动态地将属性分配给属性而不出现'集合具有固定大小”异常?

Susan Sarandon
发布: 2025-01-02 22:42:40
原创
706 人浏览过

How Can I Dynamically Assign Attributes to Properties in C# Without the

动态为属性分配属性

在尝试在运行时为属性分配验证属性时,您遇到了“Collection was of固定大小”例外。此错误背后的原因是属性描述符的属性集合无法直接修改。我们的目标是探索一种替代方法来完成属性分配。

提供的代码片段尝试使用 FillAttributes 方法来添加属性,但此方法通常仅供内部使用,可能无法在所有情况下访问案例。更可靠的方法是创建动态程序集和类型,然后将属性分配给新创建的类型。

让我们深入研究一个示例:

using System;
using System.Reflection;
using System.Reflection.Emit;

public class ValidationAttribute : Attribute
{
    public string ErrorMessage { get; set; }
}

public class Person
{
    public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        AssemblyName assemblyName = new AssemblyName("MyPersonAssembly");
        AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyPersonModule");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("MyPerson", TypeAttributes.Public);

        PropertyBuilder namePropertyBuilder = typeBuilder.DefineProperty("Name", PropertyAttributes.None, typeof(string), null);

        ConstructorInfo attributeConstructor = typeof(ValidationAttribute).GetConstructor(new[] { typeof(string) });
        CustomAttributeBuilder attributeBuilder = new CustomAttributeBuilder(attributeConstructor, new object[] { "Name is required" });

        namePropertyBuilder.SetCustomAttribute(attributeBuilder);

        Type newPersonType = typeBuilder.CreateType();
        Person person = (Person)Activator.CreateInstance(newPersonType);
    }
}
登录后复制

在此示例中,我们创建一个动态装配、模块和类型。然后,我们创建一个属性并为其分配自定义验证属性。最后,我们创建动态创建类型的实例,并可以验证属性是否已正确分配。

通过使用这种方法,我们避免了“集合具有固定大小”异常,并将属性动态分配给属性,允许运行时属性修改具有更大的灵活性。

以上是如何在 C# 中动态地将属性分配给属性而不出现'集合具有固定大小”异常?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板