C# - 通过相同的方法传递不同类型的对象

时间:2017-04-03 11:11:53

标签: c# .net

原始问题

所以我有这三个对象......

public class obj1
{
  public int Id { get; set; }
  public string Name { get; set; }
}

public class obj2
{
  public int AccNum { get; set; }
  public string Name { get; set; }
}

public class obj3
{
  public string Email { get; set; }
  public string Phone { get; set; }
}

...和一个应该接收其中一个的方法,在评估对象类型后,程序应该决定调用哪个函数。

我尝试过泛型,但它不能像我预期的那样工作。到目前为止,这就是我所拥有的......

    public class NotificationHelper: INotificationHelper
    {

        public bool SendNotification<TNotInfo>(TNotInfo obj) where TNotInfo : class
        {
            if (contract.GetType() == typeof (obj1))
            {
                var sender = new SendSMS();
                return sender.Send(obj);
            }
            if (contract.GetType() == typeof(obj2))
            {
                var sender = new SendPush();
                return sender.Send(obj);
            }
            else
            {
                var sender = new SendEmail();
                return sender.Send(obj);
            }
        }
    }

但是我收到错误“无法从TNotInfo转换为Models.obj1”。有没有办法克服这个问题?或者我必须改变我的逻辑?

感谢任何帮助,提前谢谢。

*修改

using System;

namespace EmailNotifications
{

    public interface IEmailNotification
    {
        void SendEmailNotification();
    }

    public class EmailNotificationA : IEmailNotification
    {

        public void SendEmailNotification(Contract1 a)
        {
            Console.WriteLine($"Sending EmailNotificationA ({a})");
        }
    }

    public class EmailNotificationB : IEmailNotification
    {
        public void SendEmailNotification(Contract2 b)
        {
            Console.WriteLine($"Sending EmailNotificationB ({b})");
        }
    }

    public class EmailNotificationC : IEmailNotification
    {

        public void SendEmailNotification(Contrac3 c)
        {
            Console.WriteLine($"Sending EmailNotificationC ({c})");
        }
    }

    public class EmailNotificationService
    {
        private readonly IEmailNotification _emailNotification;

        public EmailNotificationService(IEmailNotification emailNotification)
        {
            this._emailNotification = emailNotification;
        }

        public void ServiceHelper()
        {
            _emailNotification.SendEmailNotification();
        }
    }
}

以上解决方案是我尝试实现的策略设计模式。但我无法设法使我的接口方法接收不同的对象,这是必需的,因为每个通知都有自己的实现。如上面没有工作的例子所示,我有3种不同的同一方法的实现,它们都接收不同的对象。知道如何使这种逻辑有效吗?

3 个答案:

答案 0 :(得分:9)

这是接口设计的目的。首先,定义一个通用接口:

public interface INotifier
{
    bool Notify();
}

其次,在objX类中实现它:

public class obj1 : INotifier
{
    public int Id { get; set; }
    public string Name { get; set; }

    public bool Notify()
    {
        var sender = new SendSMS();
        return sender.Send(this);
    }
}

public class obj2 : INotifier
{
    public int AccNum { get; set; }
    public string Name { get; set; }

    public bool Notify()
    {
        var sender = new SendPush();
        return sender.Send(this);
    }
}

public class obj3 : INotifier
{
    public string Email { get; set; }
    public string Phone { get; set; }

    public bool Notify()
    {
        var sender = new SendEmail();
        return sender.Send(this);
    }
}

最后,更改通知方法以接受接口类型作为参数:

public class NotificationHelper : INotificationHelper
{
    public bool SendNotification(INotifier obj)
    {
        return obj.Notify();
    }
}

答案 1 :(得分:4)

另一种方法是重载方法 因为您根据给定的类型有不同的逻辑。类型没有任何共同之处(接口/抽象类)。

public class NotificationHelper
{
    public bool SendNotification(obj1 obj)
    {
        var sender = new SendSMS();
        return sender.Send(obj);
    }

    public bool SendNotification(obj2 obj)
    {
        var sender = new SendPush();
        return sender.Send(obj);
    }

    public bool SendNotification(obj3 obj)
    {
        var sender = new SendEmail();
        return sender.Send(obj);
    }
}

然后使用将足够清楚

var someObject = GetObjectFromSomeWhere();
var isSuccessful = SendNotification(someObject);

答案 2 :(得分:1)

我建议创建一个父类,这3个继承

public class ParentType { }
public class Obj1 : ParentType { ... }

该方法只会请求父类型,例如:

public bool SendNotification(ParentType obj) { ... }