关于C#中泛型的方法问题

jer*_*ley 2 c# generics

假设您正在创建一组对象来处理某些XML解析,并且它们都采用完全相同的对象,XElement ......就这样

public class User
{
    public User(XElement xmlElement)
    {
          Id = xmlElement.GetElementValue("UserId"); 
    }

    public string Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想做的是一种像这样的方法..

public static T ToParsedObject<T>(this XElement xmlElement) where T : new()
{
    return new T(xmlElement);
}
Run Code Online (Sandbox Code Playgroud)

我认为不可能像这样做一个静态(扩展方法),但我想把它作为一个我可以重用的方法.我厌倦了写作......

public static User ToUser(this XElement xmlElement)
{
    return new User(xmlElement);
}
Run Code Online (Sandbox Code Playgroud)

任何想法或指导?

Jon*_*eet 7

不幸的是,没有办法像这样提供构造函数调用.

两个可能的选择:

  • 使类型成为可变(ick)并使其实现一个接口,例如IParseableFromXElement.然后你可以写:

    public static T ToParsedObject<T>(this XElement xmlElement) 
        where T : new(), IParseableFromXElement
    {
        T ret = new T();
        ret.Parse(xmlElement);
        return ret;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 从类型到委托构造类型的字典:

    static Dictionary<Type, Func<XElement, object>> factories = 
        new Dictionary<Type, Func<XElement, object>> 
    {
        { typeof(User), x => new User(x) },
        ...
    };
    
    public static T ToParsedObject<T>(this XElement xmlElement) 
    {
        Func<XElement, object> factory = factories[typeof(T)];
        return (T) factory(xmlElement);
    }
    
    Run Code Online (Sandbox Code Playgroud)

两者都有点hacky,但他们会工作......