2014-08-30 3 views
1

Мне нужно создать функцию, которая принимает имена свойств List и 2 T и возвращает список, соответствующий требованиям указанного интерфейса, а также любые другие свойства T.Преобразование неизвестного класса в новый класс с указанным интерфейсом

Например.

interface ITest 
{ 
    int ID {get;set}; 
    int ParentID {get;set;}; 
} 

Потребитель имеет любой класс, конвертируемые в этот интерфейс, но с потенциально различными свойствами, чем требуется с помощью интерфейса:

public class ConsumingClass 
{ 
    public int ConsumingClassID {get;set; 
    public int ConsumingClassParentID {get;set;} 
    public string namex {get;set;} 
    public string namey {get;set;} 
} 

Таким образом, потребитель должен получить объект, который отвечает требованиям норм интерфейс, поэтому он хочет вызвать функцию, например:

List<ITest> getnewlist = ConvertList<ConsumingClass>(consuminglist, "ConsumingClassID", "ConsumingClassParentID"); 

сигнатура метода будет выглядеть следующим образом:

public List<ITest> ConvertList<T>(List<T> ListBeingConverted, string IDAlias, string ParentIDAlias) 
{ 
    //code needs to return a list meeting ITest requirements plus any other properties contained in T 
} 

Редактировать: Я изменил подпись, чтобы более точно отразить то, что я хочу вернуть.

+0

Что вопрос? – MarcinJuraszek

+0

Почему просто не наследовать 'ConsumingClass' от' ITest' ????? – Tony

+0

1. ITest или Список >? 2. Нужны имена строк? Да: потребуется отражение: Нет: могут использоваться делегаты или LINQ/Lambdas. – firda

ответ

1

Выведите из ITest создать класс, который адаптирует экземпляр ConsumingClass, чтобы соответствовать интерфейсу ITest:

class AnyObjectAsITest : ITest { 
public object Object; 
public string PropertyName; 

public int ID { 
    get { 
    return (int)Object.GetType().GetProperty(PropertyName).GetValue(Object, null); 
    } 
} 
//... 
} 
+0

Я не совсем понимаю это, но, возможно, это может быть сведено ... как я могу AnyObjectAsITest содержать все другие свойства объекта динамически? – apierceSO

+0

Вам необходимо реализовать * все * методы интерфейса. Я просто реализовал один для демонстрационных целей. Кроме того, вам нужно установить два поля. – usr

+0

Установка двух полей, я понимаю. Как взять namex и namey в моем примере на новые свойства, называемые «namex» и «namey» в этом классе, также необходимо сделать, и я не вижу этого в вашем коде. Может быть, вы можете показать пример того, как он будет реализован. – apierceSO