用ILSpy反编译一个dll,其中有个函数无法编译通过.如下(别的反编译工具生成代码可能不甚相同):public static IEnumerable<T> Query<T>(this DbConnection cn, string commandText, params object[] parameters)
{
var func = null;
List<T> list = new List<T>();
DbCommand dbCommand = DB.CreateCommand(commandText, cn, parameters);
IEnumerable<DB.PropInfo<T>> props = null;
Type typeFromHandle = typeof(T);
bool flag = typeFromHandle.IsPrimitive || typeFromHandle.IsValueType || typeFromHandle == typeof(string);
if (!flag)
{
props = DB.GetSettableProps<T>();
}
DbDataReader dbDataReader = dbCommand.ExecuteReader();
if (!dbDataReader.HasRows)
{
dbDataReader.Close();
return list;
}
if (flag)
{
while (dbDataReader.Read())
{
list.Add((T)((object)Convert.ChangeType(dbDataReader[0], typeof(T))));
}
}
else
{
List<string> list2 = new List<string>();
for (int i = 0; i < dbDataReader.FieldCount; i++)
{
list2.Add(dbDataReader.GetName(i));
}
var arg_10E_0 = 
from n in list2
select new
{
n = n,
prop = props.FirstOrDefault((DB.PropInfo<T> p) => string.Equals(p.Name, n, StringComparison.Ordinal)) ?? props.FirstOrDefault((DB.PropInfo<T> p) => string.Equals(p.Name, n, StringComparison.OrdinalIgnoreCase))
};
if (func == null)
{
func = (<>h__TransparentIdentifier0 => new
{
Name = <>h__TransparentIdentifier0.n,
Property = <>h__TransparentIdentifier0.prop
});
}
var list3 = arg_10E_0.Select(func).ToList();
while (dbDataReader.Read())
{
T t = Activator.CreateInstance<T>();
foreach (var current in list3)
{
current.Property.Setter(t, Convert.ChangeType(dbDataReader[current.Name], current.Property.Type));
}
list.Add(t);
}
}
dbDataReader.Close();
return list;
}
这里有几句无法编译:            if (func == null)
{
func = (<>h__TransparentIdentifier0 => new
{
Name = <>h__TransparentIdentifier0.n,
Property = <>h__TransparentIdentifier0.prop
});
}
100分求能帮忙还原成可编译通过的代码?谢谢!

解决方案 »

  1.   


            public static IEnumerable<T> Query<T>(this DbConnection cn, string commandText, params object[] parameters)
    {
        //var func = null;
        List<T> list = new List<T>();
        DbCommand dbCommand = DB.CreateCommand(commandText, cn, parameters);
        IEnumerable<DB.PropInfo<T>> props = null;
        Type typeFromHandle = typeof(T);
        bool flag = typeFromHandle.IsPrimitive || typeFromHandle.IsValueType || typeFromHandle == typeof(string);
        if (!flag)
        {
            props = DB.GetSettableProps<T>();
        }
        DbDataReader dbDataReader = dbCommand.ExecuteReader();
        if (!dbDataReader.HasRows)
        {
            dbDataReader.Close();
            return list;
        }
        if (flag)
        {
            while (dbDataReader.Read())
            {
                list.Add((T)((object)Convert.ChangeType(dbDataReader[0], typeof(T))));
            }
        }
        else
        {
            List<string> list2 = new List<string>();
            for (int i = 0; i < dbDataReader.FieldCount; i++)
            {
                list2.Add(dbDataReader.GetName(i));
            }
            var arg_10E_0 = 
                from n in list2
                select new
                {
                    n = n,
                    prop = props.FirstOrDefault((DB.PropInfo<T> p) => string.Equals(p.Name, n, StringComparison.Ordinal)) ?? props.FirstOrDefault((DB.PropInfo<T> p) => string.Equals(p.Name, n, StringComparison.OrdinalIgnoreCase))
                };
            //if (func == null)
            //{
            //    func = (<>h__TransparentIdentifier0 => new
            //    {
            //        Name = <>h__TransparentIdentifier0.n,
            //        Property = <>h__TransparentIdentifier0.prop
            //    });
            //}
            var list3 = arg_10E_0.Select(item => new { Name = item.n, Property = item.prop });
            while (dbDataReader.Read())
            {
                T t = Activator.CreateInstance<T>();
                foreach (var current in list3)
                {
                    current.Property.Setter(t, Convert.ChangeType(dbDataReader[current.Name], current.Property.Type));
                }
                list.Add(t);
            }
        }
        dbDataReader.Close();
        return list;
    }var arg_10E_0的时候返回匿名类型的属性为:n和prop
    var list3 = arg_10E_0.Select(func).ToList();
    select传入一个Func委托,目的只是把匿名对象的属性名称改了一下(Name=n和Property=prop)。