Можно ли установить переменную с типом, который является суперклассом класса в 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, которая делает это возможным

Другие вопросы по тегам