使用params关键字和动态类型参数

时间:2016-03-06 17:16:15

标签: c# generics

我已声明使用Add方法添加新项目,2个类TopicModelCommentModel来存储数据。

我在控制台模式下重写代码,如下所示:

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)行给了我错误消息:

  

方法的类型参数&#39; Topic.Add(params T [])&#39;不可能是   从用法推断。尝试明确指定类型参数。

然后,我再次尝试:

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以接受多种参数类型?

1 个答案:

答案 0 :(得分:3)

TopicModel和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();
    }
}