Присоедините существующий CustomAttribute к полю, используя C # - PullRequest
0 голосов
/ 11 марта 2019

Я заметил, что это дубликат TypeBuilder - Добавление атрибутов , поэтому запрашивается закрытие.

У меня есть код, который динамически добавляет поле в TypeBuilder.поле также содержит существующую аннотацию / обычную запись, которую я хочу добавить.Как я могу это сделать?

    private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType, ColumnAttribute annotation)
    {
        FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);

        PropertyBuilder propertyBuilder = tb.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
        MethodBuilder getPropMthdBldr = tb.DefineMethod("get_" + propertyName, MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
        ILGenerator getIl = getPropMthdBldr.GetILGenerator();

        getIl.Emit(OpCodes.Ldarg_0);
        getIl.Emit(OpCodes.Ldfld, fieldBuilder);
        getIl.Emit(OpCodes.Ret);

        MethodBuilder setPropMthdBldr =
            tb.DefineMethod("set_" + propertyName,
                MethodAttributes.Public |
                MethodAttributes.SpecialName |
                MethodAttributes.HideBySig,
                null, new[] { propertyType });

        ILGenerator setIl = setPropMthdBldr.GetILGenerator();
        Label modifyProperty = setIl.DefineLabel();
        Label exitSet = setIl.DefineLabel();

        setIl.MarkLabel(modifyProperty);
        setIl.Emit(OpCodes.Ldarg_0);
        setIl.Emit(OpCodes.Ldarg_1);
        setIl.Emit(OpCodes.Stfld, fieldBuilder);

        setIl.Emit(OpCodes.Nop);
        setIl.MarkLabel(exitSet);
        setIl.Emit(OpCodes.Ret);

        propertyBuilder.SetGetMethod(getPropMthdBldr);
        propertyBuilder.SetSetMethod(setPropMthdBldr);

        ????????
        Code the add the annotation to the property here.
    }

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Вы можете построить CustomAttributeBuilder для вашего атрибута:

Type[] ctorParams = new Type[] { /*Types of your Attributes Constructor*/ };
ConstructorInfo classCtorInfo = typeof(ColumnAttribute).GetConstructor(ctorParams);

CustomAttributeBuilder myCABuilder = new CustomAttributeBuilder(
                        classCtorInfo,
                        /*arguments for your Attribute*/);

propertyBuilder.SetCustomAttribute(myCABuilder);
0 голосов
/ 14 марта 2019

Это невозможно. CustomAttribute должен создаваться динамически. Смотрите этот вопрос для получения дополнительной информации. TypeBuilder - Добавление атрибутов

...