Во-первых, любое общее решение для «Дружественного имени» по-прежнему должно быть параметризовано обоими типами, так что я не думаю, что это то, что вы ищете, поскольку оно не спасет вас от набора текста..
Если вы хотите, чтобы у FriendlyName
уже были привязаны типы, тогда я думаю, что вы можете получить работоспособное решение, используя Неявные преобразования и шаблон Decorator .
ВНИМАНИЕ !!!Я просто набрал это в браузере (без IDE или компилятора), и мой C # очень ржавый, так что это, вероятно, нужно будет настроить
public interface FooFactory : IGenericFactory<Foo, FooEnum> {
IGenericFactory<Foo, FooEnum> Wrapped { get; }
// The "magic" - Note that magic always makes your code harder to understand...
public static implicit operator FooFactory(IGenericFactory<Foo, FooEnum> wrapped) {
// I think this can be placed here. If C# won't let you add this
// implicit operator here, then you can easily implement this factory
// method as an extension on IGenericFactory<Foo, FooEnum>
return new FooFactoryWrapper(wrapped);
}
public static implicit operator IGenericFactory<Foo, FooEnum>(FooFactory wrapper) {
return wrapper.Wrapped;
}
// I'm pretty sure we can hide this implementation here in the interface,
// but again, my C# is pretty rusty, so you may have to move this
// and/or change the visibility
private class FooFactoryWrapper : FooFactory {
public IGenericFactory<Foo, FooEnum> Wrapped { get; private set; }
public FooFactoryWrapper(IGenericFactory<Foo, FooEnum> wrapped) {
this.wrapped = wrapped;
}
// Since the "friendly type" is still an instance of the base type,
// you'll still have to fully implement that interface. Just delegate
// all calls to your wrapped type (most useless Decorator ever)
public Foo Make() { return Wrapped.Make(); } // sample method in IGenericFactory<>
}
}
Теперь вы должны быть в состоянии использовать это так:
IGenericFactory<Foo, FooEnum> inter = GetTheInterface();
FooFactory fn = inter; // implicit conversion to wrapper type
DoWork(fn); // use the "friendly name" like it were it's wrapped type
// implicit conversion back to wrapped type
public void DoWork(IGenericFactory<Foo, FooEnum> fooFactory) {
...
}
Несмотря на это, я бы не стал проходить через это усилие.Всякий раз, когда я делаю типы «Friendly Name», подобные этим, я делаю их частью моей «модели» и воспринимаю их как надлежащие типы, что означает, что я напрямую запрашиваю их в сигнатурах методов и конструкторах.
Примерно так:
public interface BarFactory : IGenericFactory<Bar, BarEnum> { }
// Asking for a BarFactory and not a IGenericFactory<Bar, BarEnum>
public void DoWork(BarFactory barFactory) { ... }
Гораздо меньше печатания и нет необходимости в магии.