这是我现在拥有的代码的精简版。
public abstract class Base
{
}
public interface IStringConstructable
{
Base Construct(string s);
}
public interface IStreamConstructable
{
Base Construct(Stream stream);
}
public class Derived1 : Base, IStreamConstructable
{
private static Derived1 singleton = new Derived1();
public static Derived1 Singleton { get { return singleton; } }
private Derived1() { }
public Derived1(Stream stream) { }
Base IStreamConstructable.Construct(Stream stream)
{
return new Derived1(stream);
}
}
public class Derived2 : Base, IStringConstructable, IStreamConstructable
{
private static Derived2 singleton = new Derived2();
public static Derived2 Singleton { get { return singleton; } }
private Derived2() { }
public Derived2(string s) { }
public Derived2(Stream stream) { }
Base IStringConstructable.Construct(string s)
{
return new Derived2(s);
}
Base IStreamConstructable.Construct(Stream stream)
{
return new Derived2(stream);
}
}
整个问题的关键是我想避免使用反射。我希望在派生类型的实现中需要的所有内容都是编译时间要求。我可以获取为给定派生类型实现的每个接口的实例的列表。然后可以根据情况调用正确的Construct方法。知道是否存在Singleton字段/属性是问题。无法保证此属性将在每个派生类上存在,因为在基类上不需要此属性。而且,每个派生类都不需要此属性。只有那些实现接口之一的接口。没有这些接口,就无法保证存在匹配的构造函数。
所有这些使我想到一个问题,即是否可以创建一个Roslyn分析器来检查特定类是否包含特定属性/字段。希望这是有道理的。