Могу ли я создать свойства интерфейса как общие? - PullRequest
0 голосов
/ 03 декабря 2018

Есть ли в любом случае создать такой интерфейс, который генерирует свойства как общие.

    public interface IInterface<T>
{
    string nameOf(T)+"_Email" { get; set; } // this won`t compile
    string nameOf(T)+"_Phone" { get; set; } // this won`t compile
}

public class Person
{
}

public class Details : IInterface<Person>
{
    public string Person_Email { get; set; }
    public string Person_Phone { get; set; }
}

Я задал вопрос выше, потому что моя проблема заключалась в следующем.Я хочу обеспечить два класса с интерфейсом контракта.Затем я объединяю эти два класса в ViewModel.Viewmodel не очень помогает, потому что мне нужны эти свойства на Razor.Пожалуйста, смотрите ниже.

public interface IPerson
{
    string Email { get; set; }
    string Phone { get; set; }
}

public interface IHotel
{
    string Email { get; set; }
    string Phone { get; set; }
}

public class Person : IPerson
{
    public string Email { get; set; }
    public string Phone { get; set; }
}

public class Hotel: IHotel
{
    public string Email { get; set; }
    public string Phone { get; set; }
}

public class ViewModel1 : IPerson, IHotel
{
    //
    // This is missing either Person or Hotel details
    //
    public string Email { get ; set ; } 
    public string Phone { get ; set ; }
}

public class ViewModel2 : IPerson, IHotel
{
    //
    // This is ok but PUBLIC modifier is not allowed, I cannot use.
    //

    string IPerson.Email { get ; set ; } // public modifier not allowed
    string IHotel.Email { get ; set ; } // public modifier not allowed
    string IPerson.Phone { get ; set ; } // public modifier not allowed
    string IHotel.Phone { get ; set ; } // public modifier not allowed
}

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Ниже приведен пример того, как вы можете иметь общие свойства в интерфейсе.Вам нужен базовый класс для перевода и связывания типа, который вы ищете

public interface IInterface<T> where T : Contact
{
    string Email { get; }
    string Phone { get; }
}

public class Person : Contact
{
    public string Phone { get; set; }
    public string Email { get; set; }
}

public class DetailsBase<T> : IInterface<T> where T : Contact
{
    Contact _cont { get; set; }
    public string Email { get { return _cont.Email; } }
    public string Phone { get { return _cont.Phone; } }
    public DetailsBase(Contact cont)
    {
        _cont = cont;
    }
}
public class Contact
{
    public string Email { get; set; }
    public string Phone { get; set; }
}

public class PersonDetails : DetailsBase<Person>
{
    public PersonDetails(Person person) : base(person)
    {

    }
}
0 голосов
/ 03 декабря 2018

Нет.Невозможно динамически изменять имена членов интерфейса с помощью универсального аргумента уровня класса.

Обобщения предназначены для того, чтобы вы могли повторно использовать одну и ту же функциональность независимо от того, какой тип универсального типа указан.Это возможно, только если интерфейс остается согласованным.

Рассмотрим эту дилемму, например:

public class Foo<T>
{
    public string GetPhone(IInterface<T> bar)
    {
        // how would I know what method to call on foo here?
        return bar.????_Phone;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...