C#.net - 覆盖现有的内置函数+获取底层方法代码

时间:2011-06-07 02:05:17

标签: c# .net

如果这些是非常基本的问题,请道歉,但是我要说我正在使用BlockingCollection的void Add(T item)函数:

1)我如何覆盖Add函数,即如果我想在开头添加一个检查然后调用基函数,这可能会这样做,如果是这样,代码看起来会是这样吗? / p>

protected sealed class BlockingCollection<T> : IEnumerable<T>
    {
        protected override void Add(T item)
        {
            // do something here
            // call base blockingcollection add function, something like return base.Add(item)??
        }
    }

2)如果不是调用基函数,而是想实际修改Add代码,有没有办法获取Add函数的底层代码?我会用像反射这样的东西吗?如果是这样,有没有办法获得底层代码而不编写我自己的程序并使用反射来获取方法代码(即我可以在Visual Studio IDE中获取底层方法代码而无需每次都编写/编译/运行代码时间我想得到一个方法的底层代码?)?

4 个答案:

答案 0 :(得分:2)

IEnumerable没有&#34;添加&#34;方法;你必须实现自己的。然而,ICollection确实!

另外,因为IEnumerable / ICollection是接口而不是类,所以没有现成的重写可供您覆盖。你必须自己做那部分。


编辑可能的额外超级正确性:

如果您正在尝试子类化BlockingCollection,并且您想要做一些额外的&#34;东西&#34;在通过&#34; Add&#34;添加T之前,您可以这样做:

public class Foo<T> : BlockingCollection<T>
{
    public new void Add(T item)
    {
        base.Add(item);
        base.Add(item);
    }
}

所以,这个非常简单的实现会添加你在Foo中添加的任何东西&#34; Add&#34;两次。

答案 1 :(得分:1)

我希望您知道自己正在创建一个全新的BlockingCollection课程,但您不会修改属于BCL的System.Collections.Concurrent.BlockingCollection<T>课程。

实际上,修改BlockingCollection<T>.Add的库版本至少是很难说的。它作为带符号的二进制文件分发,而.NET并没有提供绕行式的机制。虽然DynamicMethod允许您向现有类添加新方法,但我不认为您可以使用它来替换现有方法。

答案 2 :(得分:0)

1)是的,这是做你要求的正确方法。

2)您使用反编译器查看您选择覆盖的库API的源代码。这是由你,人,而不是程序执行的一部分完成的。

反思有点不同。它允许您的代码在运行时访问API,但不访问也不公开API的源代码。那里有很多资源,但您可以从MSDN开始。

<强>更新

由于您覆盖的方法是void,因此您可能无法通过返回某些内容来更改实现。试试这个:

protected override void Add(T item)
{
    // do something here
    // call base blockingcollection add function
    base.Add(item);

    // this is unnecessary, but you could do it for giggles
    return;
}

答案 3 :(得分:0)

如果原始库允许您覆盖添加,则您显示的伪代码位于正确的轨道上。如果我理解你的问题,你需要做一些修改。

首先,您将创建自己的类,继承旧类,如果尚未由实现IEnumerable接口的旧类完成。当然,如果旧班级“密封”,你将无法做到这一点。

protected sealed class MyBlockingCollection<T> : BlockingCollection<T>, IEnumerable<T>
{
    protected override void Add<T>(T item)
    {
    }
}

现在将您的班级标记为密封将阻止任何人进一步覆盖暴露的方法。如果旧班级被标记为密封,则您将无法执行此操作。

要查看代码,您需要使用可能容易或困难的工具对库进行反编译,具体取决于可能会或可能不会使用的混淆程度,以防止您做到这一点。

编辑:只需查看代码,您应该检查一个引用,以确保您具有适合您要执行的操作的语法。