gpt4 book ai didi

c# - 动态转换问题

转载 作者:行者123 更新时间:2023-12-02 08:33:37 26 4
gpt4 key购买 nike

我一直在寻找解决我一直遇到的问题的方法,但当我认为我找到了解决方法时却发现它不起作用。问题是我有一个 CustomAttriburte 数组,我想将它们转换为它们的实际类型,这样我就可以根据它们的类型将每个传递给不同的方法。例如:我有一个用于 RangeAttribute 和 DisplayFormatAttribute 的单独方法,我希望调用正确的方法。

我做了一个测试控制台应用程序,其中有一个基类和 2 个子类,它们每个都有各自的“DoSomething(T t)”方法。通过将方法运行为:“DoSomething(x as dynamic)”,为数组中的每个元素调用了正确的方法。

以下作品:

class Base{} 
class ChildA : Base {}
class ChildB : Base {}
class Program {
static void Main(string[] args)
{
Base[] c = { new ChildA(), new Base(), new ChildB() };
Console.Out.WriteLine(DoSomething(c[0] as dynamic));
Console.Out.WriteLine(DoSomething(c[1] as dynamic));
Console.Out.WriteLine(DoSomething(c[2] as dynamic));
Console.ReadLine();
}
static string DoSomething(Base b) { return "Base";}
static string DoSomething(ChildA c) { return "ChildA";}
static string DoSomething(ChildB c) { return "ChildB";}
}

这导致了我想要的输出:

ChildA
Base
ChildB

所以这是有效的,但在我的实际应用程序中我得到一个 RuntimeBinderException

我的代码是:

class Seeder {
public void Seed() {
...
CustomAttributeData[] custAtrData = propertyInfo.CustomAttributes.ToArray();
for(int i = 0; i < custAtrData.Length; i++) {
custAtrData[i] = Behavior.Bug(custAtrData[i] as dynamic);
}
}
}
class Behavior {
public static RangeAttribute Bug(RangeAttribute) {... }
public static DisplayAttribute Bug(DisplayAttribute) {...}
...
}

异常表示方法 Bug 的最佳重载有一些无效参数,但只有一个参数,我已经验证该参数确实匹配 Bug 方法的重载。

那么,为什么这在我的测试应用程序中有效,但在实际应用程序中却无效?

最佳答案

CustomAttributeData 是一个单独的类,它保存关于来自程序集的属性的基本元数据。

它不运行实际的属性代码,也不是属性类的实例。

您需要 GetCustomAttributes(),它实例化并返回您的实际属性类。


此外,您应该避免那样使用dynamic;它相当慢。

相反,您可以简单地让所有属性都继承一个基类或接口(interface),然后将方法放在属性类本身中,并通过基类型直接调用它们。

关于c# - 动态转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24213403/

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