相关疑难解决方法(0)

泛型类的静态成员是否与特定实例绑定?

这更像是一个文档,而不是一个真实的问题.这似乎还没有在SO上得到解决(除非我错过了),所以这里有:

想象一下包含静态成员的泛型类:

class Foo<T> {
    public static int member;
}
Run Code Online (Sandbox Code Playgroud)

是否有每个特定类的成员的新实例,或者所有Foo类类只有一个实例?

可以通过以下代码轻松验证:

Foo<int>.member = 1;
Foo<string>.member = 2;
Console.WriteLine (Foo<int>.member);
Run Code Online (Sandbox Code Playgroud)

结果是什么,这种行为记录在哪里?

.net c# generics static

76
推荐指数
2
解决办法
2万
查看次数

快速创建对象而不是Activator.CreateInstance(type)

我正在努力提高应用程序的性能.我们有很多Activator.CreateInstance调用引起了一些悲伤.

我们基于一个接口(ITabDocument)实例化了很多类,在浏览后我想到了使用这段代码:

代码并不比使用我们拥有的Activator.CreateInstance代码更好(实际上稍慢).

    public static Func<T> CreateInstance<T>(Type objType) where T : class, new()
    {
        var dynMethod = new DynamicMethod("DM$OBJ_FACTORY_" + objType.Name, objType, null, objType);
        ILGenerator ilGen = dynMethod.GetILGenerator();
        ilGen.Emit(OpCodes.Newobj, objType.GetConstructor(Type.EmptyTypes));
        ilGen.Emit(OpCodes.Ret);
        return (Func<T>)dynMethod.CreateDelegate(typeof(Func<T>));
    }
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会这样,我所做的只是:

ITabDocument document = CreateInstance<ITabDocument>(Type.GetType("[Company].Something"));
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来创建有助于上述内容的对象?当你不确定具体的类型时,它有点难.

c# reflection reflection.emit createinstance activator

31
推荐指数
4
解决办法
3万
查看次数

如何指定从表达式树方法返回的对象?

我正在尝试使用返回对象的表达式树创建一个方法,但我无法弄清楚如何实际指定要返回的对象.我试过读过这个,但实际上似乎没有在任何地方指定返回值.

我已经完成了所有的任务和内容,但是如何指定从使用表达式树创建的方法返回的对象?

编辑:这些是v4表达式树,我试图创建的方法是这样的:

private object ReadStruct(BinaryReader reader) {
    StructType obj = new StructType();
    obj.Field1 = reader.ReadSomething();
    obj.Field2 = reader.ReadSomething();
    //...more...
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

.net expression-trees

21
推荐指数
3
解决办法
9653
查看次数

为什么要使用SqlDataReader的GetOrdinal()方法

使用以下语法从SqlDataReader读取值之间的区别是什么:

Dim reader As SqlClient.SqlDataReader
reader("value").ToString()
Run Code Online (Sandbox Code Playgroud)

要么

Dim reader As SqlClient.SqlDataReader
reader.GetString(reader.GetOrdinal("value"))
Run Code Online (Sandbox Code Playgroud)

sqldatareader

18
推荐指数
2
解决办法
2万
查看次数

为什么c#编译器在使用new()约束的泛型类型调用new in时会发出Activator.CreateInstance?

如果您有以下代码:

static T GenericConstruct<T>() where T : new()
{
    return new T();
}
Run Code Online (Sandbox Code Playgroud)

C#编译器坚持发出对Activator.CreateInstance的调用,这比本机构造函数慢得多.

我有以下解决方法:

public static class ParameterlessConstructor<T>
    where T : new()
{
    public static T Create()
    {
        return _func();
    }

    private static Func<T> CreateFunc()
    {
        return Expression.Lambda<Func<T>>( Expression.New( typeof( T ) ) ).Compile();
    }

    private static Func<T> _func = CreateFunc();
}

// Example:
// Foo foo = ParameterlessConstructor<Foo>.Create();
Run Code Online (Sandbox Code Playgroud)

但是,为什么这个解决方案应该是必要的,这对我没有意义.

c# generics performance constructor

17
推荐指数
2
解决办法
3418
查看次数

C# - 使用泛型的IDataReader到Object映射

如何使用泛型将DataReader对象映射到类对象?

例如,我需要执行以下操作:

public class Mapper<T>
    {
        public static List<T> MapObject(IDataReader dr)
        {
            List<T> objects = new List<T>();

            while (dr.Read())
            {
                //Mapping goes here...
            }

            return objects;
        }
    }
Run Code Online (Sandbox Code Playgroud)

后来我需要调用这个类方法,如下所示:

IDataReder dataReader = DBUtil.Fetchdata("SELECT * FROM Book");

List<Book> bookList = Mapper<Book>.MapObject(dataReder);

foreach (Book b in bookList)
{
     Console.WriteLine(b.ID + ", " + b.BookName);
}
Run Code Online (Sandbox Code Playgroud)

注意,Mapper - 类应该能够映射由T表示的任何类型的对象.

c# mapping ado.net automapping

10
推荐指数
1
解决办法
9464
查看次数

如何将数据读取器转换为动态查询结果

我有一个View,通常从WebMatrix查询(IEnumerable<dynamic>数据类型)获取查询结果,并在表中显示结果:

@model MySite.Models.Entity
@foreach(var row in Model.Data)
{
    <tr>
        @foreach (var column in row.Columns)
        {
            <td>@column<span>:</span> @row[column]</td>
        }
    </tr>
}
Run Code Online (Sandbox Code Playgroud)

这是我查询数据库的模型:

public class Entity
{
    public dynamic Data {get; set; }
    public Entity(String table)
    {
        if (table == "User" || table == "Group)
        {
            WebMatrix.Data.Database db = new WebMatrix.Data.Database();
            db.Open(ConString);
            Data = db.Query("SELECT * FROM " + table);
        }
        else
        {
            using (OdbcConnection con = ne4w OdbcConnection(ConString))
            {
                OdbcCommand com = new OdbcCommand("Select * From " + table); …
Run Code Online (Sandbox Code Playgroud)

c# webmatrix

10
推荐指数
1
解决办法
1万
查看次数

如何将DataReader映射到类属性并保持性能?

前言:

  1. 使用DbProviderFactories创建所有数据连接字符串,连接等.
  2. 代码是来自多个库的C#和VB.Net混合.

我正在将DbDataReader映射到实体并具有一些基准:

[0] retrieved 159180 records in 45135 ms
[1] retrieved 159180 records in 45008 ms
[2] retrieved 159180 records in 44814 ms
[3] retrieved 159180 records in 44987 ms
[4] retrieved 159180 records in 44914 ms
[5] retrieved 159180 records in 45224 ms
[6] retrieved 159180 records in 45829 ms
[7] retrieved 159180 records in 60762 ms
[8] retrieved 159180 records in 52128 ms
[9] retrieved 159180 records in 47982 ms  
Run Code Online (Sandbox Code Playgroud)

考虑到从Sql Server Management Studio查询只需要17秒,这是一个非常大的时间和极差.我的选择声明:

"SELECT*FROM tbl_MyTable" …

c# reflection datareader

7
推荐指数
1
解决办法
1万
查看次数

使用一个函数从DataRow或DataReader中提取

我正在寻找一种解决方案,用于在使用DataRow和仅具有一个功能(或一个基本功能)的DataReader时如何从数据库中提取数据.

我的问题源于这样一个事实:有时候我需要一个DataReader,有时我需要一个DataTable/DataRow但是为了从这些对象中提取数据,我需要两个单独的数据访问方法,因为它们不共享一个接口.

基本上当我的数据库结构发生变化时,我不想进入并在多个函数中编写以下数据检索代码:

someValue = dr["someValue"]
Run Code Online (Sandbox Code Playgroud)

它是相同的语法并做同样的事情所以我想要一个共享该功能的函数,无论我是使用DataReader还是DataTable/DataRow从数据库中提取数据.

.net c# sql datareader datarow

6
推荐指数
1
解决办法
1万
查看次数

使用反射将datareader转换为列表的最快方法

我正在使用反射将datareader转换为通用集合列表.任何人都可以建议我为此实现反射的最佳方法吗?我想要最快的路?

c# asp.net

2
推荐指数
1
解决办法
5144
查看次数