我有一个ASP.NET MVC(非核心)项目,遇到了一些问题,我认为终于可以解决如何正确使用泛型可以解决我的问题了。
我的情况是我有一个SQL连接,该连接返回数据,并且根据SQL中一个字段的结果,我想使用两种不同的模型。这些模型具有许多共同的属性,因此我认为最佳实践是创建一种方法,该方法选择要创建的模型,填充差异,返回模型,然后继续填充“公共”属性。
我尝试阅读一些有关泛型的知识,但是我对此很陌生,所以我没有取得太大进展。
我的代码示例如下:
public ResultVM MainClass()
{
var resultData = new ResultVM();
// ... SQL returns data
while (reader.Read())
{
resultData.Add(reader);
}
return resultData;
}
public object CreateObject(SqlDataReader indata)
{
if((indata["Associate"].ToString()) == "0")
{
var individual = new Individual();
}
else
{
var group = new Group();
}
return object;
}
如何动态地(取决于Associate
字段的值)创建个人或组?
答案 0 :(得分:0)
如何实现具有所有通用属性的接口?
类似
interface IInterface
{
string CommonProperty1 { get; set; }
string CommonProperty2 { get; set; }
}
class Individual : IInterface
{
// ...
}
class Group : IInterface
{
// ...
}
public IInterface CreateObject(SqlDataReader indata)
{
if((indata["Associate"].ToString()) == "0")
{
var individual = new Individual();
// ...
return individual;
}
else
{
var group = new Group();
// ...
return group;
}
}
答案 1 :(得分:0)
我建议您直接与System.Type
合作。根据您的实际需求,这里可以有多种更优雅的解决方案:
indata.GetFieldType(int ordinal)
将返回您字段的.NET类型Serialize data with type handling,那么您可以在非通用反序列化之后简单地获取类型。例如:
var result = JsonConvert.DeserializeObject(dataJson);
result
将具有您实际对象类型的Type。您可以检查它是否写入result.GetType()并创建此类型的对象。有关更高级的用法,请参见Activator.CreateInstance(...)
在大多数情况下,使用接口是最好的方法:
interface ISomething
{
// ...
}
class Individual : ISomething
{
// ...
}
class Group : ISomething
{
// ...
}
然后,您通过这种方式构建非泛型方法:
public ISomething CreateObject(SqlDataReader indata)
{
if((indata["Associate"].ToString()) == "0")
return new Individual();
else
return new Group();
}
您创建的通用对象可能看起来像这样:
public T CreateObject<T>(SqlDataReader indata)
{
var o = new T();
return o;
}
在键入T
的地方,您将通过以下方法传递:CreateObject<YourType>(indata)
T
可以是您想要的任何类型,包括接口。在使用泛型时,您可能还希望通过使用is
关键字来检查类型,但是我建议使用接口并完全避免使用is
检查。
示例:
if(yourObject is YourType)
{
(yourObject as YourType).SomeSpecificToYourTypeMethod();
// ...
}