2016-03-06 59 views
2

我已經宣佈了一個接口與Add方法添加新項目,2類TopicModelCommentModel來存儲數據。使用params關鍵字與動態類型參數

我重新寫在控制檯模式下的代碼,就像這樣:

interface IAction 
{ 
    void Add<T>(params T[] t) where T : class; 
} 

class TopicModel 
{ 
    public string Id { get; set; } 
    public string Author { get; set; } 
} 

class CommentModel 
{ 
    public string Id { get; set; } 
    public string Content { get; set; } 
} 

class Topic : IDisposable, IAction 
{ 
    public void Add<T>(params T[] t) where T : class 
    { 
     var topic = t[0] as TopicModel; 
     var comment = t[1] as CommentModel; 

     // do stuff... 
    } 

    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class MainClass 
{ 
    static void Main() 
    { 
     var t = new TopicModel { Id = "T101", Author = "Harry" }; 
     var c = new CommentModel { Id = "C101", Content = "Comment 01" }; 

     using (var topic = new Topic()) 
     { 
      //topic.Add(t, c); 
     } 
    } 
} 

topic.Add(t, c)給我的錯誤信息:

的方法「Topic.Add類型參數( params T [])'不能從 推斷出來的用法。嘗試明確指定類型參數。

topic.Add(c, c) // Good :)) 
topic.Add(t, t, t); // That's okay =)) 

這是我的問題:

然後,我已經再次嘗試。我想要的方法接受2種不同的類型(TopicModelCommentModel)。

而且,我不想聲明:

interface IAction 
{ 
    void Add(TopicModel t, CommentModel c); 
} 

,因爲其他類可以重新使用不同的參數類型中Add方法。

所以,我的問題是:如何更改params T[] t接受多個參數類型?

+7

該代碼根本不是通用的。您希望調用者傳遞正確類型的參數,但編譯器無法實際驗證和執行該參數。你可能會使用* object *。 –

+0

「Add」方法有望與哪些類型配合使用?例如,它可以爲'int'類型工作嗎?在Add方法的主體中,您明確地將第一個參數轉換爲'TopicModel',將第二個參數轉換爲'CommentModel',這意味着您期待這些特定類型。您需要爲有關「Add」方法應該做什麼的問題添加更多上下文。 –

+0

@YacoubMassad如果我把'topic.Add(t,c)'改爲'topic.Add(t,t)'或'topic.Add(c,c)',那麼它不會給我任何錯誤' –

回答

3

TopicModel et CommentModel必須繼承相同的類或實現相同的接口。試試這個:

interface IAction 
{ 
    void Add<T>(params T[] t) where T : IModel; 
} 

class IModel 
{ 
} 

class TopicModel : IModel 
{ 
    public string Id { get; set; } 
    public string Author { get; set; } 
} 

class CommentModel : IModel 
{ 
    public string Id { get; set; } 
    public string Content { get; set; } 
} 

class Topic : IDisposable, IAction 
{ 
    public void Add<T>(params T[] t) where T : IModel 
    { 
     var topic = t[0] as TopicModel; 
     var comment = t[1] as CommentModel; 

     Console.WriteLine("Topic witch ID={0} added",topic.Id); 
     Console.WriteLine("Commment witch ID={0} added", comment.Id); 
    } 

    public void Dispose() 
    { 

    } 
} 

class Program 
{ 
    static void Main() 
    { 
     TopicModel t = new TopicModel { Id = "T101", Author = "Harry" }; 
     CommentModel c = new CommentModel { Id = "C101", Content = "Comment 01" }; 

     using (var topic = new Topic()) 
     { 
      topic.Add<IModel>(t, c); 
     } 

     Console.ReadLine(); 
    } 
} 
+0

非常感謝!這是幫助:) –

+0

不客氣。 :) – Coding4Fun