C #: реализовать интерфейс со свойством любого типа - PullRequest
3 голосов
/ 16 января 2011

Я пытаюсь реализовать интерфейс, требующий отдельного свойства, но мне все равно, какой это тип. Например:

public interface IName
{
    dynamic Name {get; set;}
}

Тогда, если у меня есть класс, я бы хотел реализовать интерфейс IName с типом строки:

public class Person : IName
{
     public string Name {get; set;}
} 

Это, однако, вызывает ошибку. Я знаю, что мог бы заставить интерфейс IName принять общий аргумент IName<T>, но это вынуждает меня создавать группу перегруженных функций, которые принимают IName<string>, IName<NameObj>, IName<etc> вместо приведения внутри одной функции.

Как я могу требовать, чтобы класс содержал свойство?

Ответы [ 4 ]

11 голосов
/ 16 января 2011
interface IName<T>
{
    T Name { get; set; }
}

class Person : IName<string>
{
    public string Name { get; set; }
}
5 голосов
/ 16 января 2011

Я не могу проверить это сейчас, но, возможно, вы могли бы реализовать интерфейс явно.

public class Person : IName
{
    public string Name {get; set;}

    dynamic IName.Name {
        get { return this.Name; }
        set { this.Name = value as string; }
    }
} 
1 голос
/ 16 января 2011

Возврат динамического позволяет вам вернуть любой тип, пожалуйста.Просто объявите тип в вашем реализующем классе как динамический.

    public interface IName
    {
        dynamic name { get; set; }
    }

    public class Person: IName
    {
        private string _name;
        public dynamic name { get { return _name; } set { _name = value;} }
    }

edit:

обратите внимание, что вам нужно быть осторожным с тем, что вы передаете name, поскольку тип значенияпроверяться только во время выполнения (радости от использования динамических типов).

Person p = new Person();
p.name = "me"; // compiles and runs fine, "me" is a string
p.name = p; // compiles fine, but will run into problems at runtime because p is not a string
0 голосов
/ 16 января 2011

Марка

public string Name {get; set;}

и сделайте возвращаемый тип Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...