这似乎是一个古老的问题,但根本无法找到我正在寻找的东西。这是我目前使用我尝试过的代码的代码。
private async Task<T> HandleFileCreate<T>(Guid tableId, IFormFile file, DocumentType documentType)
where T : DocumentLibrary
{
// This works fine and gets the correct type
Type repoType = _unitOfWork.GetType().GetProperty(typeof(T).Name + "Repository").PropertyType;
// This works fine and creates an instance of my document
T document = (T)Activator.CreateInstance(typeof(T));
// Throws up error: "No parameterless constructor defined for this object."
object instance = Activator.CreateInstance(repoType);
// Throws up error: "Object does not match target type."
repoType.GetMethod("Create").Invoke(repoType, new object[] { document });
}
看起来有点像鸡肉和鸡蛋,因为我可以发票&#34;创造&#34;似乎没有CreateInstance,因为IoC我无法做到。
这真的很烦人,因为我已经在_unitOfWork中获得了一个与我相关的GenericRepository直接相关的实例化属性,我只是无法弄清楚如何访问它?我甚至不必重新实例化它。
答案 0 :(得分:2)
Rader然后使用反射(总是一个坏主意)我建议做这样的事情
public static T Create<T>(IDocumentLibraryCreator<T> repo)// You can add you params here
where T: DocumentLibrary, new()
{
var newItem = new T();
repo.Create(newItem);
//Do your stuff here
return newItem;
}
public interface IDocumentLibraryCreator<T> where T : DocumentLibrary
{
Task Create(T document);
}
public abstract class DocumentLibrary
{
}
因为您将通过反射得到的只是运行时异常而不是编译时异常。不需要反思。你的repo需要实现IDocumentLibraryCreator<T>
接口,但如果你以一种好的方式做了IRepository,你应该已经有了这样的东西。
如果您需要在单个Unite of work中完成工作,则需要传递在uof类中创建的实例。