2016-02-11 6 views
0

Как я могу сделать что-то подобное? Я нашел How do I use reflection to call a generic method?, но не уверен, что это мое дело.C# Call Обычный метод от общего метода

public class XmlSerializer 
{ 
    public string Serialize<T>(T obj) where T : class 
    { 
     return string.Empty; 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     MakeRequst<string>("value"); 
    } 


    public static void MakeRequst<T>(T myObject) 
    { 
     var XmlSerializer = new XmlSerializer(); 
     XmlSerializer.Serialize<T>(myObject); 
    } 
} 
+5

'public static void MakeRequst (T myObject) где T: class' – Dennis

+0

@Dennis Можете ли вы объяснить, почему это необходимо? – Maarten

+1

@Maarten, поскольку общий аргумент метода 'Serialize()' ограничен ссылочными типами. Когда 'MakeRequst()' вызывает его с * unconstrained * 'T, ограничение не может быть принудительно. – haim770

ответ

5

Общий метод, который вызывает другой шаблонный метод, не может быть меньше ограничений, чем метод называют:

public class Foo 
{ 
    public void Bar1<T>() where T : class {} 
    public void Bar2<T>() where T : class 
    { 
     Bar1<T>(); // same constraints, it's OK 
    } 

    public void Bar3<T>() where T : class, ISomeInterface 
    { 
     Bar1<T>(); // more constraints, it's OK too 
    } 

    public void Bar4<T>() 
    { 
     Bar1<T>(); // less constraints, error 
    } 
} 

Здесь Bar4 метод ломает Bar1 ограничения, поскольку она позволяет передавать значение введите в качестве общего аргумента, но это недопустимо для метода Bar1.

Смежные вопросы