构造对方法的调用

本文关键字:调用 方法 | 更新日期: 2023-09-27 18:07:02

嗨,我有一个包含很多类的命名空间它们都有一个Destroy(int id)方法我想用动态word来调用这个方法

下面是我的例子:

public bool DeleteElement<T>(T tElement)
{
    Type t = typeof(T);
    dynamic element = tElement;
    var id = element.Id;
    //until here everything is fine
    //here I want to say 
    (namespace).myClassName.Destroy(id);
    //the name of  myClassName is like t.ToString()
}

我可以避免在命名空间顶部包含一个using。我们的想法是使用动态调用静态方法,而不是反射,请注意Destroy是t的静态方法,我需要这样的t。Destroy(id)

构造对方法的调用

如果Destroy(int id)是一个静态方法,难道不能创建一个实例方法来调用这个静态方法吗?

public void Destroy()
{
    ThisClass.Destroy(this.Id);
}

你可以定义一个IDestroyable接口实现所有这些类:

interface IDestroyable { void Destroy(); }

然后修改你的DeleteElement方法如下:

public bool DeleteElement<T>(T tElement) where T : IDestroyable
{
    tElement.Destroy();
}

这里不需要使用dynamic…实际上,在这种情况下使用dynamic通常是一个糟糕的设计。这是相当罕见的,实际上需要 dynamic,除了在它被创建的场景(例如与动态语言互操作)

(如果生成了类,但它们具有partial修饰符,则可以在生成器未触及的另一个文件中声明新方法)


编辑:如果生成的类不是partial,你不能修改它们…所以另一个解决方案是使用反射;我知道你想避免这种情况(我认为是出于性能原因),但是你可以通过对每种类型只做一次反射来限制性能影响:你只需要为每种类型创建和缓存一个委托。

class DestroyHelper<T>
{
    static readonly Action<int> _destroy;
    static readonly Func<T, int> _getId;
    static DestroyHelper()
    {
        var destroyMethod = typeof(T).GetMethod("Destroy", BindingFlags.Static | BindingFlags.Public);
        _destroy = (Action<int>)Delegate.CreateDelegate(typeof(Action<int>), destroyMethod);
        var getIdMethod = typeof(T).GetProperty("Id").GetGetMethod();
        _getId = (Func<T, int>)Delegate.CreateDelegate(typeof(Func<T, int>), getIdMethod);
    }
    public static void Destroy(T element)
    {
        _destroy(_getId(element));
    }
}