我可以创建通用的接口属性吗?

时间:2018-12-03 19:42:14

标签: c# interface

无论如何,有没有创建这样的接口来生成通用属性。

    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 :(得分:2)

不。不能使用类级别的通用参数动态修改接口成员的名称。

泛型旨在使您能够重用相同的功能,而不管指定了哪种泛型类型。只有在界面保持一致的情况下才有可能。

例如考虑这个难题:

public class Foo<T>
{
    public string GetPhone(IInterface<T> bar)
    {
        // how would I know what method to call on foo here?
        return bar.????_Phone;
    }
}

答案 1 :(得分:0)

以下是如何在接口中具有通用属性的示例。您需要一个基类来为您翻译并绑定您要查找的类型

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)
    {

    }
}