gpt4 book ai didi

c# - 如何使用动态构造对方法的调用

转载 作者:太空宇宙 更新时间:2023-11-03 20:05:08 25 4
gpt4 key购买 nike

您好,我有一个包含很多类的命名空间,它们都有一个方法 Destroy(int id)我想使用动态词调用该方法。

这是我的例子:

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 的 namespace 。这个想法是使用动态调用该静态方法,而不是反射,请注意 Destroy 是 T 的静态方法。我需要这样的东西 T.Destroy(id)

最佳答案

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

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

然后您可以定义一个由所有这些类实现的IDestroyable 接口(interface):

interface IDestroyable { void Destroy(); }

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

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

这里不需要使用dynamic...实际上,在这种情况下使用dynamic通常是糟糕设计的表现。实际上需要 dynamic 是非常罕见的,除非在创建它的场景中(例如与动态语言的互操作)

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


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

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));
}
}

关于c# - 如何使用动态构造对方法的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com