2016-09-07 65 views
0

我需要實例化一個列表屬性,泛型類型可以是任何東西。具有任何泛型參數的泛型屬性列表

所以我Main - 方法如下:(現實,ParsingObject<T>是對象我從服務中獲得)

public static void Main() 
{ 
    Parser parser = new Parser(); 
    parser.AddAnObject(
     new ParsingObject<int>{PropertyName = "FirstProperty", Active=true, DefaultValue=1} 
    ); 
    parser.AddAnObject(
     new ParsingObject<bool>{PropertyName = "SecondProperty", Active=false, DefaultValue=false} 
    ); 
    parser.Parse(); 
} 

ParsingObject得到任何類型的(我認爲只有字符串,BOOL,INT,... )一般。現在在我的解析器我需要把這個對象添加到像List<ParsingObject<T>>

public class Parser 
{ 
    private readonly List<ParsingObject<T>> _listOfObjects = new List<ParsingObject<T>>(); 

    public void AddAnObject<T>(ParsingObject<T> item) 
    { 
     _listOfObjects.Add(item); 
    } 

    public void Parse() 
    { 
     foreach(var item in _listOfObjects.Where(w=>Active)) 
     { 
      DoSomething(item); 
     } 
    } 
} 

,但我知道,在實例化列表時我無法設置T作爲一般的參數(編譯哭..)。 所以我可以通過使用ArrayList來解決這個問題 - 但之後我無法訪問每個對象的屬性。 (見Parse() - 方法)

的完整性,這是我ParsingObject<T> -class:

public class ParsingObject<T> 
{ 
    public string PropertyName { get; set; } 
    public bool Active { get; set; } 
    public T DefaultValue { get; set; } 
} 

任何想法如何,我可以解決這個問題?我無法修改ParsingObject<T>-課程。

+1

tada!您現在已經意識到這種通用模式的侷限性。 – Jamiec

+0

這就是傷心......( –

+0

不是真的 - 當你想起它時,它顯然無法工作!_listOfObjects會知道下一個項是'int'還是'string' – Jamiec

回答

1

取決於究竟是你的最終目標,也許這樣的事情就足夠了:

public class ParsingObjectBase 
{ 
    public string PropertyName { get; set; } 
    public bool Active { get; set; } 
    public Type ValueType { get; protected set; } 

    public object DefVal { get; protected set; } 
} 
public class ParsingObject<T> : ParsingObjectBase 
{ 
    public object DefaultValue 
    { 
     get { return (T)DefVal; } 
     set { DefVal = value; } 
    } 

    public ParsingObject() 
    { 
     ValueType = typeof(T); 
    } 
} 

private readonly List<ParsingObjectBase> _listOfObjects = new List<ParsingObjectBase>(); 

public void AddAnObject<T>(ParsingObject<T> item) 
{ 
    _listOfObjects.Add(item); 
} 

public void Parse() 
{ 
    foreach(var item in _listOfObjects.Where(w=>w.Active)) 
    { 
     DoSomething(item); //do what exactly? 
    } 
} 

你顯然離不開鑄造要麼在這種情況下,混凝土ParsingObject<T>DefVal價值,但你必須Type信息存儲在一個地方,並有權訪問您的特定屬性。也許更改ValueType某種enum會更容易使用switch

+0

聽起來像一個解決方案。有沒有辦法從'ParsingObjectBase'返回一個對象到'ParsingObject '? –

+0

@Matthias你需要進行轉換,這意味着你需要知道類型,因此我對'switch'的評論(或者可能是[這個](http://stackoverflow.com/questions/39368486/generic-property-list-with-any-generic-argument/39369062#39369062)) – slawekwin

+0

我懂了終於。感謝您的幫助:) –