這個問題的主要問題是,當我們將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 {}
最後,我創造了一些功能,在給定的T級檢索驗證
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);
}
,此功能將正常工作當T SimpleUserInfo但是當T的UserInfo會出現問題。如何解決這個問題?
PS。解決這個問題並不需要使用C#4.0的新特性。但我只是告訴你,我將在C#4.0中應用此解決方案。
感謝,
你說有問題發生,但你沒有說出什麼問題。如果你傳入UserInfo for T,那麼你期望發生什麼?你還沒有爲UserInfo定義一個驗證器,所以這應該返回null。不是嗎?有什麼問題? – 2009-12-14 15:43:42
我認爲這個問題與協變有關 - 'GetCustomAttribute'爲'UserInfo'返回一個'IValidator'實例,因爲**基類**被標記了該屬性。因此,'GetValidator '會拋出'InvalidCastException',因爲泛型類型參數不一樣。 –
Groo
2009-12-14 16:10:31
我明白你的觀點。在這種情況下,你會想*反變換*,而不是*協變*。 – 2009-12-14 16:26:34