Reflectionを介して[]を入力します。
-
13-12-2019 - |
質問
目標
オブジェクト[]ソース、オブジェクトターゲット、およびfieldInfo var(var.fieldType.isArrayがtrue)。 var.setvalue(ターゲット、ソース)を実行したいです。 ただし、「オブジェクト[] " - >" anothertype [] "
を変換することはできません。サンプルラン
object[]Source=new object[2]{"Hello","World"};
Var.SetValue(Target,Source); //Cannot Convert "object[]"->"string[]"
.
[注:INTS、Double、Floatsなどを使用できるようにしたいのですが、この問題は自然に簡単になるでしょう]
研究
var:を使用 var配列を作成できないために使用できません
使用一般的なもの:
これは
に働くmyField.SetValue(target,GenericCastArray<string>(source));
.
しかし、
では機能しませんType someType=typeof(string); //or int, or float
(myfield.SetValue(target,GenericCastArray< someType > (source))
.
* http://社会。 msdn.microsoft.com/forums/en-us/csharplanguage/thread/fe14d396- bc35-4f98-851d-ce3c8663cd79/ * NULL参照例外を返し、this.getType()
編集:Meh Solution コメントに基づいて、オブジェクト[]からString []に変換することは不可能です。 ただし、次のコードは適切に適切に機能します。
object[]Source=null;
Type basetype=Var.FieldType.GetElementType();
int l=somelength;
if (basetype.IsEquivalentTo(typeof(string))) Source = new string[l];
//repeat for all types
source=//run your Reflection here
var.SetValue(target,source);
. 解決
これらのタイプの配列を別のタイプの配列にキャストすることはできません(つまり、object[]
からstring[]
へ)は、異なる非互換型です。反射はどちらかをキャストするのに役立ちません。
変換するには、常に直接またはLINQ変換関数の1つを介してIEnumerable<DestinationType>
を作成することによって、常に配列のコピーを作成する必要があります。
所属していません StackOverflow