Общ метод за разширение с ограничение на интерфейса

Направих общ метод за разширение (т.е. AsXml), но все още искам ограничение с интерфейс (IXmlable) за някои от моите класове.

Веднага след като въведох моето ограничение, някои от моите методи ми се карат.

Един от моите методи е връщане на List<Interest> и компилаторът казва:

Типът „System.Collections.Generic.List“ не може да се използва като параметър на типа „T“ в общия тип или метод „MyWebApp.Entities.Extension.AsXml(T)“. Няма имплицитно преобразуване на препратка от „System.Collections.Generic.List“ към „MyWebApp.Interfaces.IXmlable“.

Това е моят клас:

public class Person : IXmlable
{
   public string Name { get; set; }
   public List<Interest> Interests { get; set; } // My Interest class also implements IXmlable
} 

Моят метод за разширение изглежда така:

 public static class Extension
    {
        public static string AsXml<T>(this T entity) where T : IXmlable
        {
             return MakeItXml(entity);
        }
    }

Това е моят метод:

return MyMethodThatReturnsAListOfPersons().AsXml();

person codingjoe    schedule 18.05.2013    source източник


Отговори (1)


Трябва да направите нещо като

return MyMethodThatReturnsAListOfPersons().Select(p => p.AsXml()).ToList();

ако приемем, че MyMethodThatReturnsAListOfPersons връща List<Person> и искате да създадете List<string>, съдържащ xml.

Това е така, защото List<T> не имплементира вашия IXmlable интерфейс, така че трябва ръчно да направите проекцията върху всеки Person елемент в списъка.

Ако трябва да правите това много, можете да създадете друг метод за разширение:

public static List<string> AsXmlList<T>(this IEnumerable<T> seq) where T : IXmlable
{
    return seq.Select(i => i.AsXml()).ToList();
}

така че вашият код тогава ще бъде:

return MyMethodThatReturnsAListOfPersons().AsXmlList();
person Lee    schedule 18.05.2013
comment
или... той може да добави друг метод за разширение, който работи на IEnumerable<T>, където T е IXmlable. - person Lasse V. Karlsen; 18.05.2013
comment
@LasseV.Karlsen можеш ли да дадеш пример. Предпочитам да не въвеждам друго ниво на картографиране на linq. - person codingjoe; 18.05.2013
comment
Ааа, виждам актуализираната ви публикация с новия метод на разширение... нека опитам. :) - person codingjoe; 18.05.2013
comment
Как моят метод MyMethodThatReturnsAListOfPersons ще извиква новия метод на разширение? - person codingjoe; 18.05.2013
comment
@Lee, да, направих това ... но нещо не работи. Това е така, защото искам да върна не List‹string›, а единичен сериализиран низ...нека опитам да направя нещо. - person codingjoe; 18.05.2013