C#将强制转换数组传递给动态类型数组的数组的接收者

时间:2019-06-10 19:50:50

标签: c# arrays dynamic types

好的,所以我可以同时进行某些工作,但是我所有的旧测试代码都被意外删除了,我无法再继续工作了……帮助!

我在库中有一个函数:

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 []转换为dynamic []”。

相同错误

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

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

您知道用户需要进行什么样的调用,看起来必须使用具有任何类型的数组来调用“ SetData”吗?

更新: 可以与这种怪兽一起使用,但是我知道我不必这样做……

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

在某一时刻有很多更简洁的代码-就像使用UseArray的简单调用一样,但现在不起作用。

被标记为重复的是因为标记它的人说我们应该使用类而不是结构,并且使用类来传递子类的对象已有充分的文档记录。尽管该建议是精心设计的,但不适用于此处。

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

将显示功能的参数更改为

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

允许用户呼叫

ncflsDisplay1.SetData( UseArray );

2 个答案:

答案 0 :(得分:0)

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

prebuild.sh

否则,您可以将其更改为MyStruct[] UseArray = new MyStruct[2]; dynamic[] newArr = new dynamic[UseArray.Length]; Array.Copy(UseArray, newArr, UseArray.Length); SetData(newArr); 或SetData(对象数据)

答案 1 :(得分:0)

好吧,尽管我知道我以前不必这样做,但我们正在朝着这个方向前进。

System.Collections.Generic.List<Deck>' could be found.

较新的解决方案:请参见已编辑问题的结尾,但基本上是现在

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

所以通话很简单

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