Мои 2 цента, однако в конце дня: как уже упоминали другие, кажется, есть два способа предотвратить свойство "__type":
а) Защита конструктора без параметров
b) Избегайте передачи класса в качестве параметра веб-методу
Если вам никогда не нужно передавать класс в качестве параметра, вы можете сделать конструктор "внутренним защищенным". Если вам нужно создать пустой объект, добавьте метод фабрики или другой конструктор с фиктивным параметром.
Однако, если вам нужно передать класс в качестве параметра веб-методу, вы обнаружите, что это не будет работать, если конструктор без параметров защищен (вызов ajax завершается неудачно, предположительно, поскольку переданные в json данные не могут быть десериализованы). в ваш класс).
Это была моя проблема, поэтому мне пришлось использовать комбинацию (a) и (b): защитить конструктор без параметров и создать фиктивный производный класс, который будет использоваться исключительно для параметров веб-методов. Например:
public class MyClass
{
protected internal MyClass() { }
public MyClass(Object someParameter) { }
...
}
// Use this class when we need to pass a JSON object into a web method
public class MyClassForParams : MyClass
{
public MyClassForParams() : base() { }
}
Любой веб-метод, который нужно использовать в MyClass, вместо этого использует MyClassForParams:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public MyClass DoSomething(MyClassForParams someObject)
{
// Do something with someObject
...
// Maybe return a MyClass object
...
}