从广义上讲,我知道(有时)使用扩展方法来处理这样的事情:
public interface IFoo
{
string Name {get;}
string ToXml();
}
public class Foo : IFoo
{
public Foo(string name)
{
Name = name;
}
public string Name {get; private set;}
public string ToXml()
{
return "<derp/>";
}
}
这就是实例的内容,让我们处理“静态”位:
public static class FooExts
{
public static IFoo Parse(this string xml)
{
return new Foo("derp");
}
}
和一个测试:
void Main()
{
var aFoo = "some xml".Parse();
Console.WriteLine(aFoo.ToXml());
}
正如@Jim 提到的那样,在某些情况下您不想要Foo
背部,在这种情况下您可能会使用类似的东西:
public static T Parse<T>(
this string xml,
Func<string, IFoo> useMeUseMe = null)
where T:IFoo
{
if(useMeUseMe == null)
useMeUseMe = (x => new Foo(x));
return (T)useMeUseMe("derp");
}
唉,当我们偏离“规范”时,我们现在必须告诉方法我们想要什么:
var aFoo = "some xml".Parse<Foo>();
Console.WriteLine(aFoo.ToXml());
var aBar = "some xml".Parse<Bar>(s => new Bar(s));
Console.WriteLine(aBar.ToXml());