首页 > 解决方案 > C#将强制转换数组传递给动态类型数组的接收者

问题描述

好的,所以我曾经有过一些工作,但是我所有的旧测试代码都被意外删除了,我无法再次工作......帮助!

我在库中有一个函数:

public int SetData( dynamic[] p_a )
    {
    int successful_count = 0;
    int _save_selected_row;

    //It goes on...
    }

用户会调用这个函数,我想我记得它是这样调用的:

    struct MyStruct
        {
        public String Name;
        public String Home_Address;
        }
    MyStruct[] UseArray = new MyStruct[2];



    private void button1_Click(object sender, EventArgs e)
        {
        UseArray[0].Name = "Override name 1";
        UseArray[0].Home_Address = "Override address 1";
        UseArray[1].Name = "Override name 2";
        UseArray[1].Home_Address = "Override address 2";

        ncflsDisplay1.SetData( UseArray );
        }

但我收到错误“无法从 MyStruct [] 转换为动态 []”。

同样的错误

ncflsDisplay1.SetData( (dynamic[]) UseArray );

我知道一个月前我有这样的工作,但是在代码清理中,我的测试程序被删除了。

知道用户需要进行的调用看起来像用他们拥有的任何类型的数组调用“SetData”吗?

更新:让它与这个怪物一起工作,但我知道我以前不必这样做......

 UseArray.Cast<dynamic>().ToArray()

曾经有过更简洁的代码——比如使用 UseArray 的简单调用,但现在不起作用。

标记为重复,因为标记它的人说我们应该使用类而不是结构,并且使用类来传递子类的对象是有据可查的。虽然这个建议是善意的,但在这里并不适用。

第一个解决方案已被事件取代。我们有一个更新的解决方案!

将显示功能的参数更改为

 public int SetData<T>( T[] p_a )

允许用户调用

ncflsDisplay1.SetData( UseArray );

标签: c#arraysdynamictypes

解决方案


如果您确实必须使用该函数并且无法更新其签名,则可以尝试复制数组:

MyStruct[] UseArray = new MyStruct[2];

dynamic[] newArr = new dynamic[UseArray.Length];

Array.Copy(UseArray, newArr, UseArray.Length);

SetData(newArr);

否则,您可以将其更改为类似SetData<T>(T data)或 SetData(object data)


推荐阅读