Вы получаете некоторые противоречивые ответы из-за соглашения об именах.Предполагается, что любой класс формы 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() };