类中的方法可以接收与参数相同的类吗?

时间:2018-01-12 22:00:53

标签: c# class

我有一个班级

public class Position
{
    public double X_long { get; set; }
    public double Y_lat { get; set; }
}

我有一个单独的函数将Position发送到我的webservice。

private void PositionSaveWeb(Position sp)
{
    var httpWebRequest = (HttpWebRequest)WebRequest
                           .Create("http://myserver.com/ApiTest/api/Position");
    httpWebRequest.ContentType = "application/json";
    httpWebRequest.Method = "POST";
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 
            | SecurityProtocolType.Tls11 
            | SecurityProtocolType.Tls;

    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    {
        string json = JsonConvert.SerializeObject(sp);
        streamWriter.Write(json);
        streamWriter.Flush();
        streamWriter.Close();
    }

    string result = TryWebRequest(httpWebRequest);
}

我想我可以/应该将该方法添加到课程中,或者就像现在一样:

public class Position
{
    public double X_long { get; set; }
    public double Y_lat { get; set; }

    public void Save (Position sp) {
    }
}

我遇到的问题是:

  • 在javascript中声明课程时,您有this。所以我可以调用JsonConvert.SerializeObject(this);,但这里不知道如何序列化对象。除非我使用公共变量在方法内创建新的位置对象。但是使用你正在创造的东西来创造一些东西感觉很奇怪。我不想创建一个不定式的递归循环。
  • 现在该类还包含一个方法,此方法也可以序列化。

那么Save应该是Class的一个方法,如果是的话我应该如何添加它?

3 个答案:

答案 0 :(得分:1)

您绝对可以将Save方法添加到您的课程中。但是,由于您未使用Position对象本身,Save方法应为static

public static void Save (Position sp) {
    ...
}
  

使用您正在创建的东西感到奇怪

使用static解决了这个问题

  

该类还包含一个方法,此方法也可以序列化。

在C#中,方法不是对象(尽管有描述方法的对象,即MethodInfo)因此,方法不会被序列化。

答案 1 :(得分:1)

JSON不包含方法,因此您添加到Position的任何方法都不会包含在内。

在这种情况下,您也可以在C#中使用this,就像在JavaScript中一样。虽然它们意味着略有不同,但您可以使用它来引用当前对象。

class Test {
    public void test() {
        Console.WriteLine(this);
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Test test = new Test();
        test.test();
    }
}

将输出TestFiddle

注意

那说我仍然不建议将Save方法添加到Position本身,因为你很可能添加了太多的责任,违反了Single Responsibility Principle

如果将Position参数保留在Position的方法上,则没有人能够正确扩展该类,也会破坏Open/closed principle

如果你像@dasblinkenlight那样使它静止,你也打破了Dependency inversion principle

JavaScript是一种函数式语言,但C#是面向对象的。虽然您可以在另一个上实现/强制使用(例如TypeScript),但从长远来看,您可能会面临其他问题。您总是可以引入新的类来分解那些感觉很奇怪的代码,我建议在这种情况下使用。

答案 2 :(得分:1)

要直接回答标题问题,一个类可以有一个带参数的方法,如果它有自己的类型,这是正常的。

public class Values
{
    public int X { get; set; }
    public int Y { get; set; }

    public void Add(Values other)
    {
        X += other.X;
        Y += other.Y;
    }
}

方法不会被序列化,因此无论是否使用该方法,类都将被序列化。

我绝对不会在PositionSaveWeb课程中添加Position方法。你的Position课程的目的是代表一个职位。你可以用这个类做一百万件事 - 序列化它,在HttpRequest中发布它,用电子邮件发送它等等。但那些东西不是那个类的责任。

它被称为单一责任原则。一个类有一个目的,只有一个改变的理由。因此,如果您确定Position有三个点,则可以更改该类。但是你不想改变那个类,因为现在你想通过一些不同的方法发送它。

所以在这种情况下,我建议PositionSaveWeb应该是它自己的类。