小编Abe*_*bel的帖子

C#使用Activator.CreateInstance

昨天我问了一个关于使用反射或策略模式动态调用方法的问题.

但是,从那时起,我决定将方法更改为实现公共接口的各个类.原因是,每个类虽然具有一些相似之处,但也执行该类所特有的某些方法.

我一直在使用这样的策略:

switch (method)
{
    case "Pivot":
        return new Pivot(originalData);
    case "GroupBy":
        return new GroupBy(originalData);
    case "Standard deviation":
        return new StandardDeviation(originalData);
    case "% phospho PRAS Protein":
        return new PhosphoPRASPercentage(originalData);
    case "AveragePPPperTreatment":
        return new AveragePPPperTreatment(originalData);
    case "AvgPPPNControl":
        return new AvgPPPNControl(originalData);
    case "PercentageInhibition":
        return new PercentageInhibition(originalData);
    default:
        throw new Exception("ERROR: Method " + method + " does not exist.");
}
Run Code Online (Sandbox Code Playgroud)

但是,随着潜在类数量的增加,我将需要不断添加新类,从而打破关闭修改规则.

相反,我使用了一个解决方案:

var test = Activator.CreateInstance(null, "MBDDXDataViews."+ _class);
       ICalculation instance = (ICalculation)test.Unwrap();
       return instance;
Run Code Online (Sandbox Code Playgroud)

实际上,_class参数是在运行时传入的类的名称.这是一种常见的方法,这会有任何性能问题吗?

我很反思,所以欢迎你提出建议.

c# reflection activator

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

如何将Expression <Func <T,bool >>转换为Predicate <T>

我有一个接受Expression<Func<T, bool>>一个参数的方法.我想在List.Find()方法中将它用作谓词,但我似乎无法将其转换为List所采用的谓词.你知道一个简单的方法吗?

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
    var list = GetList<T>();

    var predicate = [what goes here to convert expression?];

    return list.Find(predicate);
}
Run Code Online (Sandbox Code Playgroud)

更新

结合tvanfosson和280Z28的答案,我现在使用这个:

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
    var list = GetList<T>();

    return list.Where(expression.Compile()).ToList();
}
Run Code Online (Sandbox Code Playgroud)

c# expression predicate

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

Object.GetType()的性能

我们的应用程序中有很多日志记录调用.我们的记录器采用System.Type参数,因此它可以显示创建调用的组件.有时候,当我们受到打扰时,我们会做以下事情:

class Foo
{
  private static readonly Type myType = typeof(Foo);

  void SomeMethod()
  {
     Logger.Log(myType, "SomeMethod started...");
  }
 }
Run Code Online (Sandbox Code Playgroud)

因为这只需要获取Type对象一次.但是,我们没有任何实际指标.任何人都知道这节省了多少调用this.GetType()每次我们登录?

(我意识到我可以自己完成指标并没有什么大问题,但是嘿,什么是StackOverflow?)

.net c# performance

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

如何检查两个Expression <Func <T,bool >>是否相同

是否有可能找出两个表达式是否相同?

喜欢以下四个表达式:

        Expression<Func<int, bool>> a = x => false;
        Expression<Func<int, bool>> b = x => false;
        Expression<Func<int, bool>> c = x => true;
        Expression<Func<int, bool>> d = x => x == 5;
Run Code Online (Sandbox Code Playgroud)

那么,至少我们可以看到:

  • a == b
  • a != c
  • a != d

但我可以在我的代码中做任何事情来解决这个问题吗?

在msdn库中查看了它

Equals:确定指定的Object是否等于当前Object.(继承自Object.)

我想这意味着至少Expression类没有覆盖equals方法成为Equatable?那你怎么做?或者我在这里要求太多了?:p

c# expression equality

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

为什么不是MessageBox TopMost?

我最近发现默认情况下默认情况下MessageBoxes不是最顶级的形式,我想知道是否有人知道你不希望消息框显示在其他窗口之上的任何情况?

当我开始在加载应用程序时显示启动画面时,我发现了这个问题,看起来我的程序仍在运行,但是MessageBox在启动画面后面等待输入...启动画面显示在不同的线程上调用消息框的线程所以我想这就是为什么它没有出现在启动之上; 但这仍然无法解释为什么MessageBox MB_TOPMOST默认没有标志?

编辑

为了更好地澄清:最后我不得不做一些与此类似的事情来制作一个消息框,代码并不完全正确,就像从内存中写的那样)

[DllImport("User32.dll")]
private int extern MessageBox(windowhandle, message, caption, flag);
public static void MessageBox(windowhandle, string message, string caption)
{
    MessageBox(windowhandle, message,caption, MB_TOPMOST);
}
Run Code Online (Sandbox Code Playgroud)

c# messagebox topmost

41
推荐指数
3
解决办法
5万
查看次数

一种检查SQL 2005中是否存在外键的方法

有没有一种简单的方法来检查表中的列是否存在外键?我正在编写一个脚本,只有当它不存在时才会添加外键.

sql sql-server-2005 foreign-keys

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

如果有三元搜索,为什么要使用二进制搜索?

我最近听说过三元搜索,我们将一个数组分成3个部分进行比较.这里将进行两次比较,但它将数组减少到n/3.人们为什么不用这么多?

algorithm binary-tree data-structures ternary-tree

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

用C#在几秒钟内创建一个巨大的虚拟文件#

我想在几秒钟内创建一个巨大的虚拟文件,说1~2 GB.这是我用C#写的:

file.writeallbytes("filename",new byte[a huge number]);
Run Code Online (Sandbox Code Playgroud)

另一种表明状态的方式如下:

long FSS = din.TotalFreeSpace;
long segments = FSS / 10000;
long last_seg = FSS % 10000;
BinaryWriter br = new BinaryWriter(fs);

for (long i = 0; i < segments; i++)
{
    br.Write(new byte[10000]);

    this.label2.Text = "segments write :" + i.ToString() + "\r\n" + "segments remain :" + ((segments-i)+1).ToString();
    Application.DoEvents();
}
br.Write(new byte[last_seg]);
this.label2.Text += "\r\nDone!";
br.Close();
Run Code Online (Sandbox Code Playgroud)

其中din是磁盘信息对象

使用这两种方法,需要2分钟或更长时间才能编写如此大的虚拟文件.有没有其他更快的方法呢?

问候.

c# file-io

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

C++ - 保持控制台窗口打开?

我的问题非常简单,但是我正在从C#转换到C++,我想知道什么命令在C++中打开控制台窗口?

我知道在C#中,最基本的方法是:

Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

或者,如果您想让用户按任意键,则:

Console.ReadKey(true);
Run Code Online (Sandbox Code Playgroud)

你是如何用C++做到的?我在这里问这个简单问题的唯一原因是,我无法在互联网上找到一个好的和明确的答案.

c++ windows console

37
推荐指数
3
解决办法
11万
查看次数

.NET Windows自动化库有什么好处(如果有的话)?

我正在寻找一个可以在本机.NET代码中使用的库,就像任何.NET程序集一样.该库的目的必须是自动化Windows(按下按钮,选择一个窗口,发送密钥,记录和回放,这类事情).

因此:该库应该在.NET中本机使用,但自动化本身必须能够定位可以接收用户输入的任何本机或.NET Windows应用程序.


建议到目前为止:

如果没有其他可用的东西,我可能会选择微软的UI自动化并升级任何需要它的项目,如果可能的话,仍然在.NET 2.0到.NET 3.5中.但我希望有一个更广泛适用的自动化框架(不需要支持2.0之前的.NET).

.net c# ui-automation

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