我有一个班级
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) {
}
}
我遇到的问题是:
this
。所以我可以调用JsonConvert.SerializeObject(this);
,但这里不知道如何序列化对象。除非我使用公共变量在方法内创建新的位置对象。但是使用你正在创造的东西来创造一些东西感觉很奇怪。我不想创建一个不定式的递归循环。那么Save
应该是Class的一个方法,如果是的话我应该如何添加它?
答案 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();
}
}
将输出Test
(Fiddle)
那说我仍然不建议将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
应该是它自己的类。