我有这样的编码方法:
var result = await db.TaskStatuses
.Select(e => new
{
Id = e.TaskStatusId,
Name = e.Name
})
.ToListAsync();
和
var result = await db.ContentStatuses
.Select(e => new
{
Id = e.ContentStatusId,
Name = e.Name
})
.ToListAsync();
var result = await db.<xxx>
.Select(e => new
{
Id = e.<xxx>Id,
Name = e.Name
})
.ToListAsync();
除了从中获取数据的数据库对象外,所有方法都是相同的。有没有一种方法可以将所有这些组合到一个方法中,我只需将对象作为参数传入?
数据库的创建方式如下:
private myContext db = new MyContext();
public partial class MyContext : DbContext
{
public DbSet<TaskStatuse> TaskStatuses { get; set; }
public DbSet<ContentStatuses> ContentStatuses { get; set; }
这是 Controller 的完整代码(Asp.Net Web-API):
namespace WebRole1.Controllers
{
[Route("api/ContentStatus/{id?}", Name = "api_ContentStatus")]
public class ContentStatusController : ApiController
{
private MyContext db = new MyContext();
public async Task<IHttpActionResult> GetMapData()
{
var result = await db.ContentStatuses
.Select(e => new
{
Id = e.ContentStatusId,
Name = e.Name
})
.ToListAsync();
return Ok(result);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
}
我的问题是我有很多这样的 Controller ,除了数据源之外,它们都是一样的。 ContentStatus、TaskStatus 等
示例类:
public class ContentStatus
{
public ContentStatus()
{
this.Contents = new List<Content>();
}
public int ContentStatusId { get; set; }
public string Name { get; set; }
public virtual ICollection<Content> Contents { get; set; }
}
public class TaskStatus
{
public TaskStatus()
{
this.Tasks = new List<Task>();
}
public int TaskStatusId { get; set; }
public string Name { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
}
最佳答案
您可以为您的类创建一个公共(public)接口(interface),在您的方法中公开您需要的属性。然后,您可以在一个可以处理任一类型项目的方法中使用此接口(interface)
public interface IIdentifiableStatus
{
int Id { get; }
string Name { get; }
}
public class ContentStatus : IIdentifiableStatus
{
public ContentStatus()
{
this.Contents = new List<Content>();
}
public int ContentStatusId { get; set; }
public string Name { get; set; }
public virtual ICollection<Content> Contents { get; set; }
int IIdentifiable.Id
{
get { return ContentStatusId; }
}
string IIdentifiable.Name
{
get { return Name; }
}
}
public class TaskStatus : IIdentifiableStatus
{
public TaskStatus()
{
this.Tasks = new List<Task>();
}
public int TaskStatusId { get; set; }
public string Name { get; set; }
public virtual ICollection<Task> Tasks { get; set; }
int IIdentifiable.Id
{
get { return TaskStatusId; }
}
string IIdentifiable.Name
{
get { return Name; }
}
}
您的方法将如下所示:
public async Task<IHttpActionResult> GetMapData(IEnumerable<IIdentifiableStatus> statuses)
{
var result = await statuses
.Select(e => new {
Id = e.Id,
Name = e.Name
})
.ToListAsync();
return Ok(result);
}
你可以这样调用方法:
GetMapData(db.ContentStatuses)
或:
GetMapData(db.TaskStatuses)
关于c# - 如何将多个相同的功能类( Controller )组合成一个以数据对象作为参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114346/