作为函数arg的接口列表

时间:2015-04-20 15:41:47

标签: c#

以下是示例代码:

class Program
{
    public class A : I {
        string a = "myClassA";
        // whatever
    }

    public class B : I
    {
        string b = "myClassB";
        // whatever
    }

    public interface I
    {
        // whatever
    }

    public static void myFunction<T>(List<T> list)
    {
        Console.WriteLine(list[0].GetType().Name); // OUTPUT : A
        Console.WriteLine(JsonConvert.SerializeObject(list[0])); // OUTPUT : {}
    }

    static void Main(string[] args)
    {
        List<I> myList = new List<I>();
        myList.Add(new A());
        myFunction(myList); // arguments mismatch ERROR
    }
}

我需要此函数来输出带有适当字段的JSON(此处应为{"a":"myClassA"}

我该怎么办?


修改

我的真实背景:

List<string> JSONElements = new List<string>();
List<I> myList = null;
getDataInList(ref myList);
listToJSON(myList, ref JSONElements);

// ...

public void getDataInList(ref List<I> theList) {
    // insert data in list
    // every elements will be A or every elements will be B
}

// ...

public void listToJSON(List<I> myList, ref List<string> JSONElements) {
     foreach (var element in myList) {
         // I want every field to be included
         // interface has no fields
         JSONElements.Add(JsonConvert.SerializeObject(element));
     }
}

此函数“listToJSON”无法正确序列化(每个元素都为{}

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

你能保持

public void myFunction(List<I> list)

(由I而非T),然后更改

List<A> myList = new List<A>();

List<I> myList = new List<I>();


在回复您的编辑后,底部的代码打印出来:

  

{&#34; Word&#34;:&#34; hello&#34;,&#34; Number&#34;:1}
  {&#34; Word&#34;:&#34;再见&#34;,&#34; Number&#34;:2}
  完成后,按任意键......

我在https://www.nuget.org/api/v2/的NuGet供稿中使用Newtonsoft.JSon版本6.0.0.0。

但是,当我将public string Word { get; set; }更改为string Word { get { return "Hello"; } }时,Word未被序列化。我不知道newtonsoft JSON序列化器是如何工作的#34;引擎盖下#34;但我想如果该字段是私有的,那么它可能会更难(de)序列化它。

public class Program
{
    public class A : I
    {
        public string Word { get; set; }

        public int Number { get; set; }
    }

    public interface I
    {
        int Number { get; set; }
    }

    public static void listToJSON(List<I> myList, ref List<string> JSONElements)
    {
        foreach (var element in myList) {
            JSONElements.Add(JsonConvert.SerializeObject(element));
        }
    }

    static void Main(string[] args)
    {
        List<I> myList = new List<I>();
        myList.Add(new A { Word = "hello", Number = 1});
        myList.Add(new A { Word = "goodbye", Number = 2});
        List<string> jsonElements = new List<string>();
        listToJSON(myList, ref jsonElements);

        Console.WriteLine(string.Join("\n", jsonElements));

        Console.WriteLine("Done, press any key...");
        Console.ReadKey();
    }
}

答案 1 :(得分:1)

我认为原因最好通过

来证明
public void myFunction(List<I> list) 
{
        list.Add(new B());
}