簡體   English   中英

C#泛型如何轉換返回類型?

[英]c# generics how to cast return type?

我有一本字典

var dictionary = new Dictionary<string,string>{{"name","Smith"},{"age","20"}};

我想將其值映射到一個類

class Person{ 
public string Name {get;set;} 
public string Age {get;set;}
}

我試圖以這種方式做到這一點

public T Map<T>(Dictionary<string, object> row) 
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return (T) p;
}

問題是我在返回類型時失敗,我不知道如何將T強制轉換為Person類。 有任何想法嗎 ? 謝謝。

問題在於此行:

var p= new Person();

您正在嘗試返回一個Person類型,盡管T可以是任何東西

您需要向該類添加一個通用類型約束 ,只允許T成為Person -盡管那不是很有用。

但是在您的情況下,甚至不需要泛型:

public Person Map(Dictionary<string, string> row) 
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return p;
}

T只是一種類型。 您不會將其投射到任何東西上。 如果您有T的實例,那么您將有(Person)T。

您也可以執行以下操作:其中T:假設您的問題的人的措詞恰好相反。

如果您有以下形式的字典:

new Dictionary<string,string>{{"Smith", "20"},{"Paul","44"}}

您可以使用LINQ輕松做到這一點。 就像是:

dictionary
    .Select(k=>new Person()
        {
            Name=k.Key,
            Age=k.Value
        })
    .ToList();

使用字典,您必須執行以下操作:

public Person GetPersonFromDictionary(Dictionary<string,string> dictionary)
{
    var myPerson = new Person()
    {
        Name=dictionary[name],
        Age=dictionary[age]
    }
    return myPerson;
}

假設您可以保證字典具有所需的值。 我認為這里不需要涉及泛型。

要么:

public Person Map(Dictionary<string, object> row) 
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return p;
}

要么:

public T Map<T>(Dictionary<string, object> row) 
 where T : Person
{
      var p= new Person();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return (T) p;
}

要么:

public T Map<T>(Dictionary<string, object> row) 
 where T : Person, new ()
{
      var p= new T();
      if (row.ContainsKey("name")) Person.Name= row["name"];
      if (row.ContainsKey("age")) Person.Age= row["age"];
      return p;
}

您可以使用反射來填充屬性:

 public static T Map<T>(Dictionary<string, string> dictionary) where T : class, new()
    {
        var obj = new T();
        var properties = typeof(T).GetProperties();

        foreach (var item in dictionary)
        {
            var prop = properties.FirstOrDefault(p => p.Name.Equals(item.Key, StringComparison.InvariantCultureIgnoreCase));
            if (prop != null)
                prop.SetValue(obj, item.Value, null);
        }

        return obj;
    }

...

 var dictionary = new Dictionary<string, string> { { "name", "Smith" }, { "age", "20" } };
 Person o = Map<Person>(dictionary);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM