2017-06-28 53 views
0

正如標題所述;我有(如下所示)一個Structure類型的數組。 但試圖從中提取數據不起作用,因爲它被評估爲Object類型。 如果不可能,如果可能的話,我真的很喜歡這種態度。是否可以將KeyValuePair <>添加爲C#中的參數類型

private Entity makeEntity(params KeyValuePair<String, object>[] fields) 
    { 
     Entity entity = new Entity(); 

     IEnumerator cons = fields.GetEnumerator(); 
     Field field; 
     Value value; 
     while (cons.MoveNext()){ 
      value = new Value(); 
       value.value = cons.Current.Value; 
      field = new Field(); 
       field.name = cons.Current.Key; 
       field.values.Add(value); 
       entity.fields.Add(field); 
     } 

     return entity; 
    } 
+0

我相信如果有問題,它與.NET('對象'類型)有關。 – Olivier10178

+0

你有沒有嘗試將'cons.Current.Value'轉換爲你需要的任何類型,然後再將它賦值給'value.value'?否則我不確定我不喜歡你問的問題:) –

+0

解釋你想要做什麼。標題*完全沒有幫助。 'params'有一個特定的語法,這裏沒有使用。你明確地說你想接收'object'值。你首先想做什麼?你是否試圖通過'動態'類型而不使用'dynamic'? –

回答

-2

我覺得在

What is the best way to convert an IEnumerator to a generic IEnumerator?

提出了鑄造功能可能是你正在尋找的解決方案:

IEnumerator<T> Cast<T>(IEnumerator iterator) 
{ 
    while (iterator.MoveNext()) 
    { 
     yield return (T) iterator.Current; 
    } 
} 

你把它在你的代碼是這樣的:

... 
var cons = Cast<KeyValuePair<String, object>>(fields.GetEnumerator()); 
... 
+0

不錯的一個人:) – Olivier10178

+0

@Lee - 你可以像這樣聲明它,但是你仍然必須進行轉換,因爲'fields.GetEnumerator()'爲你提供非通用版本。 –

+1

@HelmutD - 令人驚訝的是'fields.GetEnumerator'只會返回非泛型'IEnumerator'接口,但您可以通過將源數組強制轉換爲'IEnumerable '來訪問它,而不是包裝枚舉器。 – Lee

0

爲什麼不使用對象(或匿名對象)呢?

private Entity makeEntity(object obj) 
{ 
    Entity entity = new Entity(); 
    foreach(var kvp in new RouteValueDictionary(obj)) 
    { 
     entity.fields.Add(new Field {name=kvp.Key, values={new Value {value=kvp.Value}}); 
    } 

    return entity; 
} 

用法是在大多數情況下要容易得多:

var x = makeEntity(new {Field1=Value1, Field2=Value2, Field3=Value3}); 
+0

如果你願意的話,你甚至可以將它轉換爲LINQ Select的單個返回值,這會更短,但是我會把它留給你。假設'Entity.fields'是可以設置的。 –

2

最簡單的解決方法是改變cons聲明類型:

IEnumerator<KeyValuePair<string, object>> cons = ((IEnumerable<KeyValuePair<string, object>>)fields).GetEnumerator(); 

然而,你應該只使用foreach遍歷元素代替:

foreach(var kvp in fields) 
{ 
    ... 
} 
相關問題