我想創建一個類,使用工廠來找到正確的類,然後調用該類的方法。 我做錯了什麼,雖然因爲在Visual Studio中的intellisense不斷警告我的錯誤,當我嘗試訪問類應該在工廠返回他們不可用的方法。類的通用工廠?
誰能告訴我我做錯了什麼?
這裏就是我想要去的類的引用代碼:
DBBase dal = DALFactory.GetDAL(typeof(T));
myCollection = dal.GetByCriteria(myCriteria, sortExpression, startRowIndex, maximumRows, propertyNamesToBypassInstantiation);
下面是DALFactory類的代碼:
internal static class DALFactory
{
// GetParser
internal static DBBase GetDAL(System.Type BOType)
{
switch (BOType.Name)
{
case "Person":
return new PersonDB();
}
// if we reach this point then we failed to find a matching type. Throw
// an exception.
throw new Exception("Unknown Type");
}
}
下面是部分代碼由工廠類返回的類的基類:
public abstract class DBBase
{
protected static T GetSingleBO<T>(ref SqlCommand command) where T : BOBase
{
return GetSingleBO<T>(ref command, null);
}
protected static T GetSingleBO<T>(ref SqlCommand command, List<string> propertyNamesToBypassInstantiation) where T : BOBase
{
T BO = default(T);
try
{
command.Connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
reader.Read();
BOParser parser = BOParserFactory.GetParser(typeof(T));
parser.PopulateOrdinals(reader);
if (propertyNamesToBypassInstantiation == null)
{
BO = (T)parser.PopulateBO(reader);
}
else
{
BO = (T)parser.PopulateBO(reader, propertyNamesToBypassInstantiation);
}
reader.Close();
}
else
{
// Whever there's no data, we return null.
BO = default(T);
}
}
catch (Exception ex)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Error populating data: {0}", ex.Message);
if (ex.InnerException != null)
{
sb.AppendFormat(" -- Inner Exception: {0}", ex.InnerException.Message);
}
throw new Exception(sb.ToString(), ex);
}
finally
{
command.Connection.Close();
command.Connection.Dispose();
}
// return the BO, it's either populated with data or null.
return BO;
}
protected static EquatableList<T> GetBOEquatableList<T>(ref SqlCommand command) where T : BOBase
{
return GetBOEquatableList<T>(ref command, null);
}
protected static EquatableList<T> GetBOEquatableList<T>(ref SqlCommand command, List<string> propertyNamesToBypassInstantiation) where T : BOBase
{
EquatableList<T> BOList = new EquatableList<T>();
try
{
command.Connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
// Get a parser for this BO type and populate
// the ordinals.
BOParser parser = BOParserFactory.GetParser(typeof(T));
parser.PopulateOrdinals(reader);
// Use the parser to build our list of BOs.
while (reader.Read())
{
T BO = default(T);
if (propertyNamesToBypassInstantiation == null)
{
BO = (T)parser.PopulateBO(reader);
}
else
{
BO = (T)parser.PopulateBO(reader, propertyNamesToBypassInstantiation);
}
BOList.Add(BO);
}
reader.Close();
}
}
catch (Exception ex)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("Error populating data: {0}", ex.Message);
if (ex.InnerException != null)
{
sb.AppendFormat(" -- Inner Exception: {0}", ex.InnerException.Message);
}
throw new Exception(sb.ToString(), ex);
}
finally
{
command.Connection.Close();
command.Connection.Dispose();
}
return BOList;
}
protected static int GetBOCount(ref SqlCommand command)
{
int count = 0;
try
{
command.CommandType = CommandType.StoredProcedure;
DbParameter idParam = command.CreateParameter();
idParam.DbType = DbType.Int32;
idParam.Direction = ParameterDirection.InputOutput;
idParam.ParameterName = "@recordCount";
idParam.Value = 0;
command.Parameters.Add(idParam);
command.Connection.Open();
command.ExecuteNonQuery();
command.Connection.Close();
count = (int)command.Parameters["@recordCount"].Value;
}
catch (Exception e)
{
throw new Exception("Error populating data", e);
}
finally
{
command.Connection.Close();
command.Connection.Dispose();
}
return count;
}
protected static bool DeleteBO(ref SqlCommand command)
{
int result = 0;
try
{
command.Connection.Open();
result = command.ExecuteNonQuery();
}
catch (Exception e)
{
throw new Exception("Error deleting data", e);
}
finally
{
command.Connection.Close();
command.Connection.Dispose();
}
return result > 0;
}
protected static int GetFKcount(ref SqlCommand command)
{
int count = 0;
try
{
command.CommandType = CommandType.StoredProcedure;
DbParameter idParam = command.CreateParameter();
idParam.DbType = DbType.Int32;
idParam.Direction = ParameterDirection.InputOutput;
idParam.ParameterName = "@recordCount";
idParam.Value = 0;
command.Parameters.Add(idParam);
command.Connection.Open();
command.ExecuteNonQuery();
command.Connection.Close();
count = (int)command.Parameters["@recordCount"].Value;
}
catch (Exception e)
{
throw new Exception("Error populating data", e);
}
finally
{
command.Connection.Close();
command.Connection.Dispose();
}
return count;
}
public static T GetById<T>(Guid Id)
where T : BOBase
{
return GetById<T>(Id, null);
}
abstract public static T GetById<T>(Guid Id, List<string> propertyNamesToBypassInstantiation)
where T : BOBase;
public static EquatableList<T> GetByCriteria<T,TCriteria>(TCriteria myCriteria)
where T : BOBase
where TCriteria : BaseCriteria
{
return GetByCriteria<T, TCriteria>(myCriteria, null);
}
public static EquatableList<T> GetByCriteria<T, TCriteria>(TCriteria myCriteria, List<string> propertyNamesToBypassInstantiation)
where T : BOBase
where TCriteria : BaseCriteria
{
return GetByCriteria<T, TCriteria>(myCriteria, null, -1, -1, propertyNamesToBypassInstantiation);
}
public static EquatableList<T> GetByCriteria<T, TCriteria>(TCriteria myCriteria, string sortExpression, int startRowIndex, int maximumRows)
where T : BOBase
where TCriteria : BaseCriteria
{
return GetByCriteria<T, TCriteria>(myCriteria, sortExpression, startRowIndex, maximumRows, null);
}
abstract public static EquatableList<T> GetByCriteria<T, TCriteria>(TCriteria myCriteria, string sortExpression, int startRowIndex, int maximumRows, List<string> propertyNamesToBypassInstantiation)
where T : BOBase
where TCriteria : BaseCriteria;
abstract public static int GetCountForCriteria<TCriteria>(TCriteria myCriteria)
where TCriteria : BaseCriteria;
abstract public static bool Save<T>(T myobject)
where T : BOBase;
abstract public static bool Delete<T>(Guid Id)
where T : BOBase;
abstract public static int GetFKcount<T>(Guid Id)
where T : BOBase;
abstract internal static void CreateCriteriaParameters<T, TCriteria>(ref SqlCommand myCommand, TCriteria myCriteria)
where T : BOBase
where TCriteria : BaseCriteria;
}
而這是最終的代碼的一部分b應該得到返回ottom類:
public partial class PersonDB : DBBase
{
public override static Person GetById(Guid Id, List<string> propertyNamesToBypassInstantiation)
{
SqlCommand command = GetDbSprocCommand("sprocPersonSelectSingleItem");
command.Parameters.Add(CreateParameter("@id", Id));
return GetSingleBO<Person>(ref command, propertyNamesToBypassInstantiation);
}
public override static EquatableList<Person> GetByCriteria(PersonCriteria myCriteria, string sortExpression, int startRowIndex, int maximumRows, List<string> propertyNamesToBypassInstantiation)
{
SqlCommand command = GetDbSprocCommand("sprocPersonSearchList");
CreateCriteriaParameters(ref command, myCriteria);
CreatePagingAndSortingParameters(ref command, sortExpression, startRowIndex, maximumRows);
return GetBOEquatableList<Person>(ref command, propertyNamesToBypassInstantiation);
}
}
您的泛型類不存在。 – SLaks 2010-09-17 20:42:44
這裏的一些代碼沒有任何意義。你的第一行你將返回一個:DBBase,但是你的抽象DBBase定義不會使用任何通用參數。我錯過了什麼嗎?另外,我可以建議你去掉一些代碼註釋以提高可讀性。 –
CodingGorilla
2010-09-17 20:44:32
我刪除了一堆評論,以便更容易閱讀,並修復了我返回DBBase而不僅僅是DBBase的錯誤。我已經在我的代碼中解決了這個問題,但是在寫出這個問題的過程中,我已經選擇了將它修復的問題。 –
2010-09-18 01:38:28