Tag: 方法

如何根据C#<4中参数的运行时类型调度方法?

我有一个对象o ,它在运行时保证是三种类型A , B或C ,所有这些都实现了一个通用接口I 我可以控制I ,但不能控制A , B或C (因此我可以使用空标记接口,或者通过使用接口以某种方式利用类型中的相似性,但我无法添加新方法或更改类型中的现有方法。) 我还有一系列MethodA , MethodB和MethodC 。 查找o的运行时类型,然后将其用作这些方法的参数。 public void MethodA(A a) { … } public void MethodB(B b) { … } public void MethodC(C c) { … } 使用此策略,现在必须对o的类型执行检查以确定应调用哪个方法。 相反,我想简单地有三个重载方法: public void Method(A a) { … } // these are all overloads of each other public void […]

c#regex – 从类文件(.cs)中选择类属性名称,方法名称和字段

我想匹配(从类文件中选择)methodsname,属性名称和字段名称。 这是示例类: class Perl { string _name; public string Name { get; set; } public Perl() { // Assign this._name this._name = “Perl”; // Assign _name _name = “Sam”; // The two forms reference the same field. Console.WriteLine(this._name); Console.WriteLine(_name); } public static string doSomething(string test) { bla test; } } 我得到了方法的代码: (?:public|private|protected)([\s\w]*)\s+(\w+)\s*\(\s*(?:\w+\s+(\w+)\s*,?\s*)+\) 我有问题: 以上正则表达式代码获取所有方法,它工作得很好,但我也希望它选择方法名称,但没有参数和访问器。 所以从exaplmce类使用我的代码结果将是: […]

如何在C#方法中识别每个参数类型?

我有一个C#方法说: MyMethod(int num, string name, Color color, MyComplexType complex) 使用reflection,我如何清楚地识别任何方法的每个参数类型? 我想通过参数类型执行一些任务。 如果类型是简单的int,string或boolean然后我做一些事情,如果它是Color,XMLDocument等我做其他事情,如果它是用户定义的类型,如MyComplexType或MyCalci等,那么我想做某些任务。 我能够使用ParameterInfo检索方法的所有参数,并可以遍历每个参数并获取它们的类型。 但是如何识别每种数据类型? foreach (var parameter in parameters) { //identify primitive types?? //identify value types //identify reference types } 编辑:这是我的代码的一部分,以创建一个属性网格排序页面,我想显示所选方法的数据类型的参数列表。 如果参数有任何用户定义的类型/引用类型,那么我想进一步展开它以显示数据类型下的所有元素。

C#中的静态方法与实例方法

对于我正在编写的应用程序,我希望具有极端的可扩展性,并且扩展方法似乎可以提供我想要的内容,以及在没有实例的情况下调用它们的能力,我也需要它。 我记得读过静态方法比实例方法更快但没有得到GC的优点。 它是否正确? 我不太可能改变我的设计,除非我找到一个更好的替代设计而不是速度。 但仍然需要额外的信息,我想知道速度,GC等的差异。 编辑:谢谢。 更多信息:假设我们有一个Person类: class Person 它可以有一个实例Distance方法,如: this.Distance (Person p) 这很好,但这并没有让我能够计算2点之间的距离(比如Point3),而不会创建Person类的实例。 我想要做的是: class Person (no Distance methods) 但是距离的扩展方法: Distance (this Person, Person) Distance (this Point3, Point3) 这样我可以这样做: myPerson.Distance (yourPerson) 和 Extensions.Distance (pointA, pointB) EDIT2:@Jon,是的,我认为这就是所谓的(没有得到GC的优点),但我不知何故认为静态方法会产生这种负担/开销。

在非静态类中调用静态方法时是否实例化了类?

究竟在Bar类中调用Foo.SomeCheck()时会发生什么? 是否为了调用SomeCheck()而创建了一个Foo实例? 如果是这样,这个实例是否存储在堆上,是否通过垃圾收集收集? public class Foo() { public static bool SomeCheck() { return true; } } public class Bar() { public void SomeMethod() { // what happens when we access Foo to call SomeCheck? if (Foo.SomeCheck()) { //do something } } }

如何为类型参数约束的generics类型编写扩展方法?

我正在使用特定于任务的.NET平台,它是预编译的而不是OpenSource。 对于某些任务,我需要扩展此类,但不是通过inheritance它。 我只是想添加一个方法。 首先,我想向您展示一个虚拟代码现有类: public class Matrix where T : new() { … public T values[,]; … } 我想以下列方式扩展这个类: public static class MatrixExtension { public static T getCalcResult(this Matrix mat) { T result = 0; … return result; } } 我从许多谷歌链接获得这种语法,所以不知道它是否正确。 编译器告诉我没有错误,但最终它不起作用。 最后,我想以下列方式调用此函数: Matrix m = new Matrix(); … int aNumber = m.getCalcResult(); 所以任何人都有了主意? 谢谢您的帮助! […]

C#Nested Try Catch语句或方法?

简单的最佳实践问题。 你应该嵌套try catch语句还是只使用方法。 例如,如果您有一个打开文件的方法可以正常工作并关闭文件,那么您可以在try catch外部打开和关闭,或者在finally块中关闭。 现在如果你的open方法失败了,那么该方法会断言吗? 那么你应该在try catch块中包装它还是应该从另一个方法调用它,而另一个方法又是一个try catch块?

由C#中的多个线程访问的方法使用Progressbar

我有多个线程访问方法。 该方法在线程执行时更新表单上的进度条。 该方法更新我的Windows窗体上的进度条,显示处理文件的进度,因为线程正在完成它们。 您将如何管理该方法以避免死锁。 我无法锁定它,不知道我是做错了,还是我应该在这种情况下锁定它。 public void myWorkerClass() { int amountToScan = 4; lblcount.BeginInvoke( ((Action)(() => lblcount.Text = “Files Checked ” + atPDFNumber.ToString() + ” of ” + amountToScan.ToString()))); decimal percentageComplete = ((decimal)atPDFNumber / (decimal)amountToScan) * 100; backgroundWorker1.ReportProgress((int)percentageComplete); } 结果是,在最后一行,它告诉我“这个操作已经调用了OperationCompleted,并且进一步的调用是非法的。” 我认为我打开的东西已经被第一个线程或类似的东西处理掉了。 这是一个很好的方法来使用multithreading的进度条(我有正确的想法或原则),或者我的代码中只有一个小错误? 我想如何让这个问题对其他人有价值的是回答这个问题如何在多个线程访问的方法中访问全局变量。 因为我认为这就是这个问题的方向。

如何将任何方法作为另一个函数的参数传递

在Aclass,我有 internal void AFoo(string s, Method DoOtherThing) { if (something) { //do something } else DoOtherThing(); } 现在我需要能够将DoOtherThing传递给AFoo() 。 我的要求是DoOtherThing可以有任何返回类型的签名几乎总是无效。 类似于B类的东西, void Foo() { new ClassA().AFoo(“hi”, BFoo); } void BFoo(//could be anything) { } 我知道我可以通过Action或实现代表来实现这一点(如许多其他SOpost中所见)但如果B类函数的签名未知,怎么能实现呢?

如何在一个类中将对象从一个方法初始化为另一个方法?

在课堂上,我有两种方法。 在method1中我创建了一个对象,但我不能在method2中使用相同的对象。 为什么? 请帮助一个简单的例子。 编码太大了,所以我给出了布局 public class Sub { } public class DataLoader { public void process1() { Sub obj = new Sub(); } public void process2() { // here I can’t use the object } }