Можно ли установить переменную с типом, который является суперклассом класса в C#?
Больше информации:
РЕДАКТИРОВАТЬ: лучший образец:
У меня есть класс в Libary под названием UserAccount, его абстракт. тогда у меня есть некоторые функции, подобные этой в библиотеке:
class UserAccountService
{
public static UserAccount CreateUserAccount(String username, String password, String email)
{
UserAccount account = new UserAccount();
account.Username = username;
account.HashedPass = //Some crypting stuff with password
account.Email = email;
UserAccountRepository db = new UserAccountRepository();
db.UserAccounts.Add(account);
return account;
}
}
Потому что это независимая библиотека, UserAccount имеет не все свойства, которые я хочу использовать:
class ExtendedUserAccount : UserAccount
{
// define some additional methods and propertys
public Contact Contacts{get;set}// this property is only used in one application where i use the Library....
}
Тогда я хочу сделать это:
ExtendedUserAccount newAccount = UserAccountService.CreateUserAccount(new UserAccount);
Но это не сработает. я теперь не правильно, но мне нужно что-то подобное...
у кого есть идея??
3 ответа
Это похоже на запах кода, и вам, вероятно, нужно изменить дизайн ваших типов... Но в любом случае, это должно работать:
class UserAccountService
{
public static TAccount CreateUserAccount<TAccount>(TAccount account)
where TAccount : UserAccount, new()
{
//create new useraccount...
return account;
}
}
Этот универсальный метод принимает экземпляр типа, который должен расширять UserAccount (или быть самим UserAccount) и объявлять конструктор без параметров. Последнее ограничение позволит вам сделать это: TAccount account = new TAccount()
,
Я рекомендую заводской шаблон
class UserAccountService
{
// ctor with interfaces
public IUserAccount CreateUserAccount()
{
// create instance
return result;
}
// ctor with generic
public IUserAccount CreateUserAccount<T>() where T : UserAccount
{
var account = Activator.CreateInstance<T>();
return account;
}
}
class ExtendedUserAccount : UserAccount
{
// define some additional methods and propertys
}
class UserAccount : IUserAccount
{
}
internal interface IUserAccount
{
}
Просто чтобы было понятно
Это твои условия?
- UserAccountService & UserAccount находятся в библиотеке A
- ExtendedUserAccount есть и будет только в библиотеке B
- Вы не можете / не хотите редактировать библиотеку A
тогда ответ может быть следующим: сделать 1 точку входа в библиотеке B, которая делает это возможным