假设您正在创建一组对象来处理某些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)
任何想法或指导?
不幸的是,没有办法像这样提供构造函数调用.
两个可能的选择:
使类型成为可变(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,但他们会工作......