Общие атрибуты в моделях MVC - PullRequest
0 голосов
/ 22 октября 2018

Я создал файл GenericAttribute.cs в моих моделях

public class GenericAttributes<T>
{
    public T Id { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedDate { get; set; }
}

Теперь я хочу добавить поле 'int id' в моей пользовательской модели

public class User
{
    //here I want to add 'Id' field
    public string UserId { get; set; }
    public string password { get; set; }
    public string UserType { get; set; }
    public int EmployeeId { get; set; }

    public virtual Employee employee { get; set; }
}

Как мне это сделать?Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Вы получаете некоторые противоречивые ответы из-за соглашения об именах.Предполагается, что любой класс формы xxxAttribute является подклассом класса Attribute.Атрибуты - это метаданные, которые вы можете прикрепить к классам, полям и т. Д. Используя отражение, вы можете прочитать эти атрибуты, что является мощным способом информирования различных API о том, как взаимодействовать с вашими пользовательскими классами - без наследования или интерфейса.

Если метаданные такого рода являются вашими намерениями, то ответ Барра J является правильным.Однако если ваше намерение состоит в том, чтобы класс GenericAttributes служил базовым классом, от которого вы можете наследовать эти свойства, то Том Джонсон прав (хотя он и изменил GenericAttributes на интерфейс вместо базового класса, но тот же результат, если все выесть такие свойства).Последнее, скорее всего, то, что вы ищете.

Я бы предложил переименовать GenericAttributes во что-то более описательное, например BaseRecord или IRecord (как интерфейс), поскольку пользователь выглядит как данные, поступающие из базы данных или идущие из нее.

Было бы также полезно иметь неуниверсальную версию класса / интерфейса, чтобы можно было ссылаться на такие записи не общим образом.

public class BaseRecord {
    public Type IdType { get; }

    private Object _id = null;
    public Object Id { 
        get {
            return _id;
        }
        set {
            if(value != null) {
                if(!IdType.IsAssignableFrom(value.GetType()))
                    throw new Exception("IdType mismatch");
            }
            _id = value;
        }
    }

    public bool IsActive { get; set; }
    public DateTime CreatedTime { get; set; }

    public BaseRecord(Type idType)
    {
        if(idType == null) throw new ArgumentNullException("idType");
        this.IdType = idType;
    }
}

namespace Generic {
    public class BaseRecord<T> : BaseRecord
    {
        new public T Id {
            get { return (T)base.Id; }
            set { base.Id = value; }
        }            

        public BaseRecord() : base(typeof(T))            
        {
        }
    }
}

public class User : Generic.BaseRecord<int>
{}

public class OtherRecord : Generic.BaseRecord<string>
{}

// This inheritence scheme gives you the flexibility to non-generically reference record objects 
// which can't be done if you only have generic base classes
BaseRecord r = new User();
r = new OtherRecord();
BaseRecord records[] = { new User(), new OtherRecord() };
0 голосов
/ 22 октября 2018

Чтобы получить доступ к идентификатору класса GenericAttributes, вам нужно привести объект User в тип базового класса.

namespace SampleApp
{
    class SampleProgram
    {
        static void Main(string[] args)
        {
            User User = new User() { Id = 1 };
            var genericAttribute = (User as GenericAttributes<int>);
            genericAttribute.Id = 2;
            var genericAttributeId = genericAttribute.Id;
            var classId = User.Id;
        }
    }
    public class GenericAttributes<T>
    {
        public T Id { get; set; }
    }
    public class User : GenericAttributes<int>
    {
        public new int Id { get; set; }
    }
}
0 голосов
/ 22 октября 2018

Вы можете сделать GenericAttributes интерфейсом, чтобы вы могли реализовать его где угодно.

Например,

public interface IGenericAttributes<T>
{
 //properties
}

И использовать в объявлении класса;

public class User : IGenericAttributes<int>
{
//properties
}

Это заставит ваш конкретный пользователь типа реализовать свойства интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...