相关疑难解决方法(0)

如何在C#中动态创建一个类?

我有一个看起来像这样的课:

public class Field
{
    public string FieldName;
    public string FieldType;
}
Run Code Online (Sandbox Code Playgroud)

并且List<Field>具有值的对象:

{"EmployeeID","int"},
{"EmployeeName","String"},
{"Designation","String"}
Run Code Online (Sandbox Code Playgroud)

我想创建一个如下所示的类:

Class DynamicClass
{
    int EmployeeID,
    String EmployeeName,
    String Designation
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

我希望在运行时生成它.我不希望物理CS文件驻留在我的文件系统中.

.net c# reflection.emit dynamic-class-creation

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

动态替换C#方法的内容?

我想要做的是改变C#方法在调用时的执行方式,这样我就可以编写如下内容:

[Distributed]
public DTask<bool> Solve(int n, DEvent<bool> callback)
{
    for (int m = 2; m < n - 1; m += 1)
        if (m % n == 0)
            return false;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

在运行时,我需要能够分析具有Distributed属性(我已经可以做)的方法,然后在函数体执行之前和函数返回之后插入代码.更重要的是,我需要能够在不修改调用Solve的代码的情况下或在函数的开头修改代码(在编译时;在运行时这样做是目标).

目前我尝试了这段代码(假设t是Solve存储的类型,m是Solve的MethodInfo):

private void WrapMethod(Type t, MethodInfo m)
{
    // Generate ILasm for delegate.
    byte[] il = typeof(Dpm).GetMethod("ReplacedSolve").GetMethodBody().GetILAsByteArray();

    // Pin the bytes in the garbage collection.
    GCHandle h = GCHandle.Alloc((object)il, GCHandleType.Pinned);
    IntPtr addr = h.AddrOfPinnedObject();
    int size = il.Length;

    // Swap the method.
    MethodRental.SwapMethodBody(t, m.MetadataToken, …
Run Code Online (Sandbox Code Playgroud)

c# methods swap cil assemblies

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

使用nameof获取当前方法的名称

浏览,搜索和希望但找不到直接答案.

无论如何在C#6.0中使用nameofwithouth指定方法名称来获取当前方法名称?

我将测试结果添加到这样的字典中:

Results.Add(nameof(Process_AddingTwoConsents_ThreeExpectedRowsAreWrittenToStream), result);
Run Code Online (Sandbox Code Playgroud)

我希望如果我不必明确指定方法名称,那么我可以复制+粘贴该行,这是一个非工作的例子:

Results.Add(nameof(this.GetExecutingMethod()), result);
Run Code Online (Sandbox Code Playgroud)

如果可能的话我不想使用Reflection.

UPDATE

这不是(如建议的)这个问题的副本.我问是否明确可以使用nameofwithout(!)反射来获取当前方法名称.

c# reflection c#-6.0 nameof

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

自动记录方法的进入和退出以及参数?

有没有办法让我添加日志记录,以便进入和退出方法与参数一起自动记录以用于跟踪目的?我该怎么办?

我正在使用Log4Net.

.net logging log4net

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

动态拦截.NET中的调用

我很想知道.NET是否支持在运行时对方法调用(或属性调用)进行任何形式的动态拦截.也就是说,您是否可以在没有静态编译信息(如接口(沿着CORBA DII(链接文本)或COM的IDispatch的行)的情况下拦截对象的调用.

如果没有,C#4.0中新的"动态类型对象"功能是否会在这方面有所帮助.

.net c# reflection dynamic

8
推荐指数
1
解决办法
6336
查看次数

迭代方法的参数以进行验证

我一直在想能够做这样的事情是有用的,例如,检查空引用的参数并最终抛出异常.
这将节省一些打字,并且如果添加新参数,也将无法忘记添加检查.

.net c# null

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

如何将回调添加到webform项目

我想为对象的所有方法添加一个通用的回调函数.我发现了这个问题,但在那个方法中,我将不得不修改该类的每个功能.我想定义一些beforeFilter在每个方法调用之前得到三角形的方法.我知道我可以用Action delegates它,但我不知道怎么做.

更新:作为一个例子,我想要的是这样的

Class MyClass

    Sub MyCallback
        'callback code...
    End Sub

    'Rest of tyhe code

End Class
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,理想情况是在所有其他方法之前添加一个简单(或多个)方法来进行三重处理.也许有一些基类或接口,我不知道(这就是我要求的原因).

我认为可能有的其他选项是克隆对象并定义一个新类,而不是将代码添加到现有类中.所以在那里Class使用Objectto来获取方法trhough Type

Class NewClass

     Sub AddCallback(Obj As Object, Callback As Action)
          'Add the callback here
     End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

我只是猜测,也许我的一些选择甚至是不可行的,所以请帮助我

最近的方法

我现在拥有的是这种方法

Sub RunWithCallback(beforFilter As Action, f As Action)

    beforeFilter()
    f()

End Sub
Run Code Online (Sandbox Code Playgroud)

(这意味着RunWithCallback使用Actions和Funcs委托管理Sub和函数的大量重载,具有不同数量的参数)要使用它,我必须运行此Sub而不是调用任何Object方法(传递ByRef参数以捕获在函数中返回值).像这样的东西

Public Sub DoNothing()
    Debug.WriteLine("Callback working!")
End Sub

Public Sub …
Run Code Online (Sandbox Code Playgroud)

c# vb.net delegates callback

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

如何听抽象方法?

在我的抽象类中,我可以监听抽象方法并在调用该方法时触发事件吗?如果有,怎么样?

c# events abstract-class

5
推荐指数
1
解决办法
297
查看次数

拦截Ninject.无法加载IProxyRequestFactory

我正在学习使用Ninject和Interceptor模式.

我有以下拦截器.

public class MyInterceptor:IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Console.WriteLine("Pre Execute: " + invocation.Request.Method.Name);

        foreach (var param in invocation.Request.Arguments)
        {
            Console.WriteLine("param : " + param);
        }

        invocation.Proceed();

        Console.WriteLine("Post Execute: " + invocation.Request.Method.Name);
        Console.WriteLine("Returned: " + invocation.ReturnValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且有一个名为MyClass只有2个简单方法的类,虚拟允许拦截器处理它们.(两种方法是Echo和double,这就像他们的名字所说的那样.)

我通过NuGet将Ninject,Ninject.Extensions.Interception和Ninject.Extensions.Interception.DynamicProxy添加到我的项目中.

添加以下using声明.

using Ninject;
using Ninject.Extensions.Interception.Infrastructure.Language;
using Ninject.Extensions.Interception;
Run Code Online (Sandbox Code Playgroud)

我的Main方法,它执行引导看起来像这样.

static void Main(string[] args)
    {
        MyClass o = null;

        using (IKernel kernel = new StandardKernel())
        {

            kernel.Bind<MyClass>().ToSelf().Intercept().With(new MyInterceptor());
            o = kernel.Get<MyClass>();
        }

        o.Echo("Hello World!"); // Error …
Run Code Online (Sandbox Code Playgroud)

c# ninject castle-dynamicproxy ninject-extensions ninject-interception

5
推荐指数
1
解决办法
1076
查看次数

使用NLog在.NET中记录方法的进入和退出

我想记录方法入口并使用NLog退出.我发现了两种方法.第一个,使用PostSharp,但需要购买.第二种方法,使用unity,但我们只能在具有接口的方法上实现它.

例如,我有一个名为SampleController的控制器

SampleController.cs

 public string Get()
        {
            BusinessLayerClass businessLayer = new BusinessLayerClass();
            return businessLayer.BusinessLayerMethod();
        }
Run Code Online (Sandbox Code Playgroud)

BusinessLayerClass.cs

public class BusinessLayerClass
    {
        public string BusinessLayerMethod()
        {
            DataLayerClass dataLayerClass = new DataLayerClass();
           return  dataLayerClass.DataLayerMethod();
        }
    }
Run Code Online (Sandbox Code Playgroud)

DataLayerClass.cs

public class DataLayerClass
    {
        public string DataLayerMethod()
        {
            return "Hi";
        }
    }
Run Code Online (Sandbox Code Playgroud)

我有两个类BusinessLayerClassDataLayerClass.Get在样品控制器呼叫的方法BusinessLayerMethodBusinessLayerClass和从该DataLayerMethod被调用.我有一个NLogging用于记录目的的课程

NLogging.cs

public static class NLogging
    {
        public static bool Enabled
        {
            get { return LogManager.IsLoggingEnabled(); }
            set
            {
                if …
Run Code Online (Sandbox Code Playgroud)

c# asp.net nlog

5
推荐指数
1
解决办法
4426
查看次数

一个班级是否有可能了解反思是否已被用于自身?

类X使用反射方法来检查类Y是否具有特定方法.是否有任何方法让Y类找出类X正在检查的方法的细节?

c# reflection

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

是否可以在C#中为静态类或静态方法生成动态代理?

我试图想出一种方法(动态或实例)方法调用可以被动态代理拦截.我想将它作为c#扩展方法实现,但坚持如何为静态方法生成动态代理.

一些用法:

Repository.GetAll<T>().CacheForMinutes(10);
Repository.GetAll<T>().LogWhenErrorOccurs();

//or     
var repo = new Repository();
repo.GetAll<T>().CacheForMinutes(10);
repo.GetAll<T>().LogWhenErrorOccurs();
Run Code Online (Sandbox Code Playgroud)

我对任何图书馆(linfu,castle.dynamic proxy 2等)开放.

谢谢!

c# aop castle-dynamicproxy

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