gpt4 book ai didi

C# 泛型/接口(interface) - 根据类返回不同的类型

转载 作者:行者123 更新时间:2023-12-02 22:08:56 25 4
gpt4 key购买 nike

对于工作,我们有特定类型的记录,但每个项目都有自己的实现。列之类的不一样,但是大体上流程是一样的(记录分批,批分配,批完成,批返回,批发送等)。许多列也很常见,但有时名称会发生​​变化(一个是 BatchId,另一个是 Id。[Column("name")] 会处理这个问题)。

目前,这是我使用接口(interface)中给出的通用组件实现批量分配功能的方法:

public interface IAssignment
{
// properties
...
// methods
T GetAssignmentRecord<T>(int UserId, int BatchId) where T : IAssignment;
List<T> GetAssignmentRecords<T>(int UserId) where T : IAssignment;
}

现在,我目前有两个具有批量分配的项目。由于这些是在 EntityFramework 中完成的,Namespace1 中的分配和 Namespace2 中的分配是完全不同的东西,但受某些共同组件(ID、分配的用户、 checkin 等)的约束,这些组件驱动返回它们的所有方法。

我想我的主要问题是我是否做错了,是否有更好的方法来实现这一点,这样我就可以将数据通过管道传输到我的 Controller 中,并让 Controller 看起来与项目有些相似,同时具有尽可能多的自动处理方法工作(主要是为了在我需要进行更新时出现“修复一个,修复所有”的情况)。

这是我如何实现命名空间 1 的示例:

public class Assignment
{
...
public T GetAssignmentRecord<T>(int UserId, int BatchId) where T : IAssignment
{
var db = new Database1Context();
return (T) Convert.ChangeType(db.Assignment.Where(c => c.UserId == UserId && c.BatchId == BatchId && c.Assigned).First(), typeof(T));
}
}

在 Controller 中:

Assignment assignment = new Assignment();
var record = assignment.GetAssignmentRecord<Assignment>(userid, batchid);
// do stuff

Controller 代码实际上是我假设的工作方式。我已经完成了 Assignment 类(class),现在我很困惑我是否以正确的方式做这件事。我觉得这可能不正确的原因是我基本上是在说“接口(interface)正在寻找一个泛型,我正在使用 Entity Framework 从数据库中获取一个强类型对象,我正在将它转换为一个泛型,当我在提出请求时,我要求的是我最初转换为泛型的同一个强类型对象。”

有更好的方法吗?或者我应该去一个完全不同的方向?

最佳答案

只要我正确理解您的目标是什么,我就会去做,例如这样……

interface IAssignment
{
}

interface IRepo<out T> where T : IAssignment
{
T GetAssignmentRecord(int UserId, int BatchId);
IEnumerable<T> GetAssignmentRecords(int UserId);
}

class AssignmentRecord : IAssignment
{
}
class AssignmentWeb : IAssignment
{
}

class RepoDb : IRepo<AssignmentRecord>
{
public AssignmentRecord GetAssignmentRecord(int UserId, int BatchId)
{
//using(var db = new MyDbContext())
//{
// return db.Assignment.Where(c => c.UserId == UserId && c.BatchId == BatchId && c.Assigned).First();
//}
return new AssignmentRecord();
}

public IEnumerable<AssignmentRecord> GetAssignmentRecords(int UserId)
{
//using(var db = new MyDbContext())
//{
// return db.Assignment.Where(c => c.UserId == UserId && c.BatchId == BatchId && c.Assigned);
//}
return new List<AssignmentRecord>
{
new AssignmentRecord(),
new AssignmentRecord(),
new AssignmentRecord(),
new AssignmentRecord(),
new AssignmentRecord(),
new AssignmentRecord(),
new AssignmentRecord(),
new AssignmentRecord(),
};
}
}

class RepoWeb : IRepo<AssignmentWeb>
{
public AssignmentWeb GetAssignmentRecord(int UserId, int BatchId)
{
// fetch it from some web service...
return new AssignmentWeb();
}

public IEnumerable<AssignmentWeb> GetAssignmentRecords(int UserId)
{
//using(var db = new MyDbContext())
//{
// return db.Assignment.Where(c => c.UserId == UserId && c.BatchId == BatchId && c.Assigned);
//}
return new List<AssignmentWeb>
{
new AssignmentWeb(),
new AssignmentWeb(),
new AssignmentWeb(),
};
}
}

class MYController
{
public IRepo<IAssignment> Repository { get; set; } // you can inject this e.g. DI

public IAssignment GetAssignment(int userid, int batchid)
{
return Repository.GetAssignmentRecord(userid, batchid);
}

public IEnumerable<IAssignment> GetAllAssignments(int userid)
{
return Repository.GetAssignmentRecords(userid);
}
}

class ProgramAssignment
{
static void Main(string[] args)
{
try
{
var controller = new MYController();
controller.Repository = new RepoDb();

IAssignment assignment = controller.GetAssignment(0, 0);
IEnumerable<IAssignment> all = controller.GetAllAssignments(0);

controller.Repository = new RepoWeb();

assignment = controller.GetAssignment(0, 0);
all = controller.GetAllAssignments(0);
}
catch
{
Console.WriteLine("");
}
}
}

至于为什么 out - 在我的另一篇文章中有更多内容......

How to make generic class that contains a Set of only its own type or subtypes as Children?

关于C# 泛型/接口(interface) - 根据类返回不同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15687981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com