我有一个automapper的接口。DTO实现了这个接口。正如你所看到的,有一个默认的方法。
public interface IMap<T> {
public void Mapping(Profile profile) {
profile.CreateMap(typeof(T), GetType()).ReverseMap();
}
}
public class ItemDto : IMap<Item> {
public string Name { get; set; }
}当我尝试调用此方法时。找不到该方法。
public class MappingProfile : Profile {
public MappingProfile() {
ApplyMappingsFromAssembly();
}
private void ApplyMappingsFromAssembly() {
var types = AppDomain.CurrentDomain.GetAssemblies().Where(w => !w.IsDynamic).SelectMany(s => s.GetExportedTypes())
.Where(t => t.GetInterfaces().Any(i =>
i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMap<>)))
.ToList();
foreach (var type in types) {
var instance = Activator.CreateInstance(type);
var methodInfo = type.GetMethod("Mapping");
//In here I expect to call default interface method.
methodInfo?.Invoke(instance, new object[] { this });
}
}
}如何调用默认接口方法?
发布于 2021-03-10 20:53:33
您需要对接口调用该方法,这也包括使用反射获取该方法。例如:
// Create the IMap<Item> type
var mapType = typeof(IMap<>).MakeGenericType(typeof(Item));
// Create the instance as you did before
var instance = Activator.CreateInstance(typeof(ItemDto));
// Get the method from the interface
var method = mapType.GetMethod("Mapping");
// Invoke the method
method.Invoke(instance, new object[] { ... });要将此代码放入您的代码中,应如下所示:
foreach (var type in types)
{
// Cheating here by getting the first interface, so you might want to be cleverer
var mapInterface = type.GetInterfaces()[0];
// Get the generic type of the interface, e.g. "Item"
var genericType = mapInterface.GetGenericArguments()[0];
var instance = Activator.CreateInstance(type);
var mapType = typeof(IMap<>).MakeGenericType(genericType);
var methodInfo = mapType.GetMethod("Mapping");
methodInfo?.Invoke(instance, new object[] { this });
}https://stackoverflow.com/questions/66564549
复制相似问题