C# 有人能解释一下这个委托语法吗?
在名为DataAccess的类库中,我发现以下声明和用法:C# 有人能解释一下这个委托语法吗?,c#,C#,在名为DataAccess的类库中,我发现以下声明和用法: public static class DataAccess { public delegate T LoadObject<T>(SqlDataReader dataReader); public static Dictionary<TKey, TValue> GetDictionaryFromReader<TKey, TValue>( Database databa
public static class DataAccess
{
public delegate T LoadObject<T>(SqlDataReader dataReader);
public static Dictionary<TKey, TValue> GetDictionaryFromReader<TKey, TValue>(
Database database
, DbCommand dbCommand
, LoadObject<KeyValuePair<TKey, TValue>> loadMethod
)
{
Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>();
using (SqlDataReader dataReader = StoredProcedures.ExecuteSqlDataReader(database, dbCommand))
{
GenerateDictionary<TKey, TValue>(dataReader, ref _dictionary, loadMethod);
}
return _dictionary;
}
}
公共静态类数据访问
{
公共委托T LoadObject(SqlDataReader);
公共静态字典GetDictionaryFromReader(
数据库
,DbCommand DbCommand
,LoadObject loadMethod
)
{
字典_Dictionary=新字典();
使用(SqlDataReader dataReader=storedprocesdures.ExecuteSqlDataReader(数据库,dbCommand))
{
GenerateDictionary(数据阅读器、参考字典、加载方法);
}
返回字典;
}
}
此静态方法调用上面的GetDictionaryFromReader:
public static Dictionary<String, String> GetGroupTypesList()
{
Dictionary<string, string> dict = new Dictionary<string, string>();
Database database = CenestDatabaseFactory.CreateDatabase();
DbCommand dbCommand = database.GetStoredProcCommand(SP_LIST_GROUP_TYPES);
dict = DataAccess.GetDictionaryFromReader<string, string>(database, dbCommand, _loadGroupType);
return dict;
}
private static KeyValuePair<string, string> _loadGroupType(SqlDataReader returnData)
{
KeyValuePair<string, string> entry =
new KeyValuePair<string, string>((string)returnData["Group_Type"], (string)returnData["Group_Type_Desc"]);
return entry;
}
公共静态字典GetGroupTypesList()
{
Dictionary dict=新字典();
Database=CenestDatabaseFactory.CreateDatabase();
DbCommand DbCommand=database.GetStoredProcCommand(SP\u列表\u组\u类型);
dict=DataAccess.GetDictionaryFromReader(数据库,dbCommand,_loadGroupType);
返回命令;
}
它将“\u loadGroupType”传递到“loadMethod”。“\u loadGroupType”如下所示:
public static Dictionary<String, String> GetGroupTypesList()
{
Dictionary<string, string> dict = new Dictionary<string, string>();
Database database = CenestDatabaseFactory.CreateDatabase();
DbCommand dbCommand = database.GetStoredProcCommand(SP_LIST_GROUP_TYPES);
dict = DataAccess.GetDictionaryFromReader<string, string>(database, dbCommand, _loadGroupType);
return dict;
}
private static KeyValuePair<string, string> _loadGroupType(SqlDataReader returnData)
{
KeyValuePair<string, string> entry =
new KeyValuePair<string, string>((string)returnData["Group_Type"], (string)returnData["Group_Type_Desc"]);
return entry;
}
private static KeyValuePair\u loadGroupType(SqlDataReader returnData)
{
KeyValuePair条目=
新的KeyValuePair((string)returnData[“Group_Type”],(string)returnData[“Group_Type_Desc”]);
返回条目;
}
我有点“得到”\u loadGroupType方法作为参数传递到GetDictionaryFromReader中。好吧,但为什么?这个委托声明语法应该说什么
public delegate T LoadObject<T>(SqlDataReader dataReader);
公共委托T LoadObject(SqlDataReader-dataReader);
我真的很想知道这是怎么回事。你不需要自己解释,但你能指出一些能让我明白的东西吗
谢谢
对@ReedCopsey的补充说明:
public static Dictionary<String, String> GetGroupTypesList()
{
Dictionary<string, string> dict = new Dictionary<string, string>();
Database database = CenestDatabaseFactory.CreateDatabase();
DbCommand dbCommand = database.GetStoredProcCommand(SP_LIST_GROUP_TYPES);
dict = DataAccess.GetDictionaryFromReader<string, string>(database, dbCommand, _loadGroupType);
return dict;
}
private static KeyValuePair<string, string> _loadGroupType(SqlDataReader returnData)
{
KeyValuePair<string, string> entry =
new KeyValuePair<string, string>((string)returnData["Group_Type"], (string)returnData["Group_Type_Desc"]);
return entry;
}
所以
在本使用声明中:
using (SqlDataReader dataReader = StoredProcedures.ExecuteSqlDataReader(database, dbCommand))
{
GenerateDictionary<TKey, TValue>(dataReader, ref _dictionary, loadMethod);
}
使用(SqlDataReader-dataReader=storedprocess.ExecuteSqlDataReader(数据库,dbCommand))
{
GenerateDictionary(数据阅读器、参考字典、加载方法);
}
C#是否足够聪明,能够识别loadMethod需要传递给它的SqlDataReader,并且能够这样做——因为using语句和初始委托声明?因为否则,我看不到数据读取器是如何将其放入方法的
当然不是!根据@ReedCopsey,GenerateDictionary方法使用SqlDataReader,Duh:
private static void GenerateDictionary<TKey, TValue>(
SqlDataReader dataReader
, ref Dictionary<TKey, TValue> dictionary
, LoadObject<KeyValuePair<TKey, TValue>> loadMethod
)
{
while (dataReader.Read())
{
KeyValuePair<TKey, TValue> kvp = loadMethod(dataReader);
dictionary.Add(kvp.Key, kvp.Value);
}
}
private static void GenerateDictionary(
SqlDataReader数据读取器
,参考字典
,LoadObject loadMethod
)
{
while(dataReader.Read())
{
KeyValuePair kvp=loadMethod(数据读取器);
添加(kvp.Key,kvp.Value);
}
}
这个委托声明语法应该说什么
public delegate T LoadObject<T>(SqlDataReader dataReader);
这是一个委托,其类型是一个方法,该方法接受SqlDataReader
作为输入,并返回一个泛型类型T
在您的情况下,T
结果是KeyValuePair
C#是否足够聪明,能够识别loadMethod需要传递给它的SqlDataReader,并且能够这样做——因为using语句和初始委托声明?因为否则,我看不到数据读取器是如何将其放入方法的 否。
GenerateDictionary
方法将使用传递给它的dataReader
调用委托
这个委托声明语法应该说什么
public delegate T LoadObject<T>(SqlDataReader dataReader);
这是一个委托,其类型是一个方法,该方法接受SqlDataReader
作为输入,并返回一个泛型类型T
在您的情况下,T
结果是KeyValuePair
C#是否足够聪明,能够识别loadMethod需要传递给它的SqlDataReader,并且能够这样做——因为using语句和初始委托声明?因为否则,我看不到数据读取器是如何将其放入方法的
否。
generatedecationary
方法将使用传递给它的dataReader
调用委托。声明公共委托T LoadObject(SqlDataReader dataReader)
需要一个SqlDataReader
,并将返回您想要的任何类型。可以是int
、列表
甚至是另一个代理。这是因为在类型T
上没有标记,它只与委托的返回类型相关联
另一方面,我们有private static KeyValuePair\u loadGroupType(SqlDataReader returnData)
。这是一个函数,它接收一个SqlDataReader
,并返回一个。。。等等,没关系,什么都可以!因此,\u loadGroupType
确实与具有T
=KeyValuePair
的委托LoadObject
匹配,并且可以隐式使用
如果声明了委托,例如
委托KeyValuePair D2(SqlDataReader)代码>它也会匹配,但这次没有泛型。当类型与操作无关(或者可以是约束类型)时,泛型是您的朋友。声明公共委托t LoadObject(SqlDataReader dataReader)
需要一个SqlDataReader
,并将返回您想要的任何类型。可以是int
、列表
甚至是另一个代理。这是因为在类型T
上没有标记,它只与委托的返回类型相关联
另一方面,我们有private static KeyValuePair\u loadGroupType(SqlDataReader returnData)
。这是一个函数,它接收一个SqlDataReader
,并返回一个。。。等等,没关系,什么都可以!因此\u loadGroupType
与委托LoadObj“匹配”