我可以使用'对象'关键字使方法更通用?

时间:2018-04-23 21:36:51

标签: c# .net

我写了一个方法,将myEvent写入path参数提供的json文件。

而不是重载此方法并且有一个方法将MyEventObject作为第一个参数,第二个重载方法以List<MyEventObject>作为第一个参数,我想知道我是否可以使用泛型&#34;对象&# 34;作为第一个参数?

方法内部的代码实际上是完全相同的代码,无论它是列表还是MyEventObject的单个对象。代码有效,但我想知道这是否是我的简单方法的最佳方法,以及在C#中完成这样的事情的最佳实践。

private void WriteEventsToFile(object myEvent, string path)
{
    string eventObject = JsonConvert.SerializeObject(myEvent);
    try
    {
        System.IO.File.WriteAllText(path, eventObject);
    }
    catch (Exception e)
    {
        Debug.WriteLine("System.IO.File.WriteAllText Exception : " + e.Message + "\nCall Stack : " + e.StackTrace);
        throw e;
    }
}

2 个答案:

答案 0 :(得分:6)

  

而不是重载此方法并且有一个方法以MyEventObject作为第一个参数,第二个重载方法以List<MyEventObject>作为第一个参数,我想知道我是否可以使用通用的“对象“作为第一个参数?

你可以。这是个坏主意。不要这样做。

采用object的方法意味着我可以接受任何对象。如果你只能接受两种东西,那么写两种方法

如果方法很短,就像这个,那就重复一遍。

几乎可以接受:如果方法很长并且您不想重复自己,那么创建一个带有对象的私有辅助方法,并且断言它的前置条件

public void WriteEventsToFile(MyEventObject myEvent, string path)
{
  WriteEventsToFileHelper(myEvent, path);
}
public void WriteEventsToFile(List<MyEventObject> myEvent, string path)
{
  WriteEventsToFileHelper(myEvent, path);
}
private void WriteEventsToFileHelper(object myEvent, string path) 
{
  Debug.Assert(myEvent is MyEventObject || myEvent is List<MyEventObject>);
  ...

但这有点严重;只有当我真的感觉没有别的办法时,我才会这样做。

类型系统是你的朋友,它可以保证你的安全和健康。使用它!

答案 1 :(得分:2)

我发现你的方法存在两个问题:

  • 如果您编写事件列表或单个事件,文件将会有所不同。
  • 当您使用API​​时可能会有点混乱 - 这里的内容是什么?

我建议像这样解决:

private void WriteEventsToFile(MyEventObject myEvent, string path) {
    WriteEventsToFile(new[] {myEvent}, path);
}
private void WriteEventsToFile(ICollection<MyEventObject> myEvents, string path)
{
    string eventObject = JsonConvert.SerializeObject(myEvents);
    try
    {
        System.IO.File.WriteAllText(path, eventObject);
    }
    catch (Exception e)
    {
        Debug.WriteLine("System.IO.File.WriteAllText Exception : " + e.Message + "\nCall Stack : " + e.StackTrace);
        throw;
    }
}