【发布时间】:2019-08-22 09:50:51
【问题描述】:
我想使用 C# 8 默认接口实现来解决我的代码中的性能问题。
其实我有这个接口:
public interface IDataAdapter {}
public interface IDataAdapter<T> : IDataAdapter
{
void Insert(T value);
}
我实际上必须对所有 IDataAdapter 进行反射,检查泛型类型并通过反射调用 Insert 以获取特定的 T 实例。我想做的是:
public interface IDataAdapter
{
void InsertValue(object value);
}
public interface IDataAdapter<T> : IDataAdapter
{
void Insert(T value);
public void InsertValue(object value) => Insert(value as T);
}
编译器说要使用关键字 new 来屏蔽继承的方法。但是,我想要完成的唯一事情是已经实现了一个非泛型方法,以使所有 IDataAdapter<T> 实现只需要实现泛型版本。
这是我可以完成的事情还是仍然不可能?我已经知道使用抽象类是解决这个问题的一种方法,但我想让开发人员拥有一个实现许多 IDataAdapter 的类...
这是我当前的反射代码:
public IEnumerable<IDataAdapter> DataAdapters { get; }
public Repository(IEnumerable<IDataAdapter> dataAdapters)
{
DataAdapters = dataAdapters;
}
public async Task SaveAsync()
{
foreach (var item in aggregates)
{
foreach (var dataAdapter in DataAdapters)
{
if (dataAdapter.GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericArguments()[0] == item.GetType()))
{
dataAdapter.GetType().GetMethod("Insert", new[] { item.GetType() }).Invoke(dataAdapter, new[] { item });
}
}
}
}
【问题讨论】:
-
扩展方法不是一个选项吗?
-
我真的看不出使用扩展方法的方式。我将更新我的问题以显示我实际所做的反思。
-
“我想让开发人员拥有一个实现许多 IDataAdapter 的类”。如果开发人员这样做,然后调用非泛型 InsertValue,非泛型会选择什么类型的 T?
-
"但是我想让一个开发者有一个实现很多IDataAdapter的类……"如果一个类实现了
IDataAdapter<Foo>和IDataAdapter<Bar>,这两种方法中的哪一种将被InsertValue调用?如您所见,这是不可能的。 -
InsertValue 完全是“Tagnostic”,因为它作为文档存储在后面,这就是为什么 object 是非通用选项的有效选项
标签: c# inheritance interface default-interface-member