2011-01-16 3 views
3

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

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> вместо того, чтобы каститься в пределах одной функции.

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

+0

Действительно ли тип возврата должен быть «любым объектом»? Каким будет код потребления, и как он будет обрабатывать буквально * любой возвращаемый объект *? Единственное, что вы действительно знаете, это методы в «Object», и если вы собираетесь использовать их, вы можете также сделать возвращаемый тип «Object». Я думаю, если это выброс или внутренний код, который вы планируете повторно использовать очень мало, тогда это может быть хорошо. Помимо этого, я предлагаю воспользоваться системой типов. –

ответ

5

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

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

    dynamic IName.Name { 
     get { return this.Name; } 
     set { this.Name = value as string; } 
    } 
} 
+1

Хорошо играл. Это полностью работает. Никогда не думал об этом. – James

9
interface IName<T> 
{ 
    T Name { get; set; } 
} 

class Person : IName<string> 
{ 
    public string Name { get; set; } 
} 
+1

Лучший способ сделать это. лучше всего избегать динамики, если вы не уверены в том, что вы делаете. И во многих случаях это не так. – Euphoric

0

Сделать

public string Name {get; set;} 

и сделать тип возвращаемого объекта.

+0

Nope: '' Person 'не реализует член интерфейса' IName.Name '. «Person.Name» не может реализовать «IName.Name», потому что у него нет соответствующего типа возврата «dynamic». «Мой код в вопросе был неправильным, хотя. Хорошая уловка и обновление. – James

1

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

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

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

редактировать:

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

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 
Смежные вопросы