Пользовательский атрибут на свойстве - Получение типа и значения приписанного свойства

Сообщение об ошибке уже подсказывало вам:

В удаленном режиме есть дополнительные изменения, и вам нужно перенести изменения в свой репозиторий, добавить свои изменения и нажать.

Чтобы проиллюстрировать проблему:

Это начинается с этого:

Remote:
             [master]
            /
A <- B <- C

Local:
             [master]
            /
A <- B <- C

Вы сделали некоторые изменения локально, а кто-то еще сделал некоторые изменения в удаленном

Remote:
                       [master]
                      /
A <- B <- C <- D <- E

Local:
                 [master]
                /
A <- B <- C <- X
[ 1115] Представьте себе, если вы перенесете изменения в пульт, как будет выглядеть пульт? Git не угадал бы это для вас, так что вам нужно иметь дело с этим локально, сгладить все, а затем нажать:

Remote:
                       [master]
                      /
A <- B <- C <- D <- E

Local:
                      [origin/master]
                     /
A <- B <- C <- D <- E
           ^    
            \-- X 
                 \
                   [master]

Затем либо слить или перебазировать его:

(В в случае слияния)

                [origin/master]   [master]
                     /            /
A <- B <- C <- D <- E <--------- Y
           ^                   /
            \-- X <-----------/

(в случае перебазировки)

                [origin/master]   [master]
                     /            /
A <- B <- C <- D <- E <--------- X'

В обоих случаях это позволит вам нажать, так как ваша локальная ветвь master является потомком master удаленного , для которого мастер пульта может перемотать вперед.

Если вместо этого вы используете push -f, вы просто заставите пульт дистанционного управления принять [master], в указанном выше случае мастер пульта станет вашим X коммитом, а коммиты D и E будут потерял. Обычно это то, что вам не нужно, особенно это основная ветвь.

29
задан Jess 12 June 2014 в 17:45
поделиться

3 ответа

Что-то вроде следующего, это будет использовать только первое попавшееся свойство, которое имеет атрибут, конечно, вы можете разместить его на нескольких...

    public object GetIDForPassedInObject(T obj)
    {
        var prop = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
                   .FirstOrDefault(p => p.GetCustomAttributes(typeof(IdentifierAttribute), false).Count() ==1);
        object ret = prop !=null ?  prop.GetValue(obj, null) : null;

        return ret;
    }  
39
ответ дан 28 November 2019 в 01:48
поделиться
public class TestClass<T>
{
    public void GetIDForPassedInObject(T obj)
    {
        PropertyInfo[] properties =
            obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);            

        PropertyInfo IdProperty = (from PropertyInfo property in properties
                           where property.GetCustomAttributes(typeof(Identifier), true).Length > 0
                           select property).First();

         if(null == IdProperty)
             throw new ArgumentException("obj does not have Identifier.");

         Object propValue = IdProperty.GetValue(entity, null)
    }
}
2
ответ дан this. __curious_geek 28 November 2019 в 01:48
поделиться

Вот больше примера реального слова. Мы используем дополнительный метод и проверку, если свойство содержит FieldMetaDataAttribute (пользовательский атрибут в моей базе исходного кода) с допустимым Майором и MinorVersion. То, что является представляющим общий интерес, является частью, где мы используем тип родительского класса и GetProperties и получаем ProperyInfo и затем используем GetCustomAttribute для получения атрибута FieldMetaDataAttribute в этом особом случае. Используйте этот код для вдохновения, как сделать больше универсального способа получить пользовательский атрибут. Это может, конечно, полироваться для создания общего метода получить данный атрибут любого свойства экземпляра класса.

        /// <summary>
    /// Executes the action if not the field is deprecated 
    /// </summary>
    /// <typeparam name="TProperty"></typeparam>
    /// <typeparam name="TForm"></typeparam>
    /// <param name="form"></param>
    /// <param name="memberExpression"></param>
    /// <param name="actionToPerform"></param>
    /// <returns>True if the action was performed</returns>
    public static bool ExecuteActionIfNotDeprecated<TForm, TProperty>(this TForm form, Expression<Func<TForm, TProperty>> memberExpression, Action actionToPerform)
    {
        var memberExpressionConverted = memberExpression.Body as MemberExpression;
        if (memberExpressionConverted == null)
            return false; 

        string memberName = memberExpressionConverted.Member.Name;


        PropertyInfo matchingProperty = typeof(TForm).GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .FirstOrDefault(p => p.Name == memberName);
        if (matchingProperty == null)
            return false; //should not occur

        var fieldMeta = matchingProperty.GetCustomAttribute(typeof(FieldMetadataAttribute), true) as FieldMetadataAttribute;
        if (fieldMeta == null)
        {
            actionToPerform();
            return true;
        }

        var formConverted = form as FormDataContract;
        if (formConverted == null)
            return false;

        if (fieldMeta.DeprecatedFromMajorVersion > 0 && formConverted.MajorVersion > fieldMeta.DeprecatedFromMajorVersion)
        {
            //major version of formConverted is deprecated for this field - do not execute action
            return false;
        }

        if (fieldMeta.DeprecatedFromMinorVersion > 0 && fieldMeta.DeprecatedFromMajorVersion > 0
                                                     && formConverted.MinorVersion >= fieldMeta.DeprecatedFromMinorVersion
                                                     && formConverted.MajorVersion >= fieldMeta.DeprecatedFromMajorVersion)
            return false; //the field is expired - do not invoke action 
        actionToPerform();
        return true;
    }
-1
ответ дан 28 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: