Основная проблема этого вопроса заключается в том, что мы передаем T в некоторую функцию и используем ее для создания какого-либо объекта, например, следующего утверждения.Как передать некоторый объект в общий класс родительского элемента T?
void SomeFunction<T> (object model)
{
(SomeClass<T>)model;
}
Все работает нормально. Но я хочу, чтобы объект модели был привязан к универсальному объекту класса, который является родителем T или великим родителем T, зависит от того, что не пусто. Как это сделать?
Обновлено # 1
Для большего понимания, пожалуйста, смотрите на следующем примере.
public partial class SimpleUserInfo
{
public string LogOnName { get;set; }
public string HashedPassword { get;set; }
}
public partial class UserInfo : SimpleUserInfo
{
pubic string Address { get;set; }
}
После создания некоторых моделей данных. Я создаю некоторый общий класс, который использует параметр UserInfo в качестве параметра.
public class SimpleUserInfoValidator : IValidator<SimpleUserInfo>
{
// logic to validate simple user info instance
}
И вот, я добавляю атрибут класса SimpleUserInfo.
[Validator(typeof(SimpleUserInfoValidator))]
public partial class SimpleUserInfo {}
Наконец, я создаю некоторые функции для извлечения валидаторов в данном классе Т.
public GetValidator<T>()
{
var attribute = (ValidatorAttribute)Attribute.GetCustomAttribute(type, typeof(ValidatorAttribute));
if (attribute == null || attribute.ValidatorType == null)
return null;
var (IValidator<T>)Activator.CreateInstance(attribute.ValidatorType);
}
Эта функция отлично работает, когда Т SimpleUserInfo, но проблема возникает, когда Т UserInfo. Как это решить?
PS. Для решения этого вопроса не требуется использовать новую функцию C# 4.0. Но я просто расскажу вам о том, как применить это решение в C# 4.0.
Спасибо,
Вы говорите, что проблема возникает, но вы не говорите, в чем проблема. Если вы передадите UserInfo для T, то что вы ожидаете? Вы не определили валидатор для UserInfo, поэтому он должен вернуть значение null. Не так ли? В чем проблема? –
Я полагаю, что проблема связана с ковариацией - 'GetCustomAttribute' возвращает экземпляр' IValidator 'для' UserInfo', потому что ** базовый класс ** помечен этим атрибутом. Таким образом, 'GetValidator ' будет вызывать 'InvalidCastException', потому что параметры типового типа не совпадают. –
Groo
Я вижу вашу точку зрения. В этом случае вам понадобится * контравариантность *, а не * ковариация *. –