Я запустил C#, и мне было интересно, есть ли такая же функциональность языка, как в Swift.
Универсальная функция декодирования c для преобразования Json данных ответов в экземпляры объектов модели, где типы соответствуют к декодируемому протоколу.
public func decode<T: Decodable>(data: Data, result: @escaping (Result<T>) -> Void) {
do {
let results = try jsonDecoder.decode(T.self, from: data)
DispatchQueue.main.async {
result(.success(results))
}
} catch let error {
// handle error
}
}
Пример объекта пользователя, декодируемый. (Пожалуйста, игнорируйте тип объекта, связанный с RealmSwift)
class User: Object, Decodable {
@objc dynamic var _id: String = ""
@objc dynamic var uid: String = ""
@objc dynamic var email: String?
@objc dynamic var phoneNumber: String?
@objc dynamic var isAnonymous = true
override static func primaryKey() -> String? {
return "uid"
}
}
Так что либо блок обратного вызова сети, либо тестовая функция вызывает декодирование.
Например,
func performRequest<T: Decodable>(request: inout URLRequest, result: @escaping (Result<T>) -> Void) -> URLSessionDataTask {
let dataTask = session.dataTask(with: request) { [weak self] data, response, error in
defer { self?.dataTask = nil }
if let data = data,
let response = response as? HTTPURLResponse {
if response.statusCode == 200 {
self?.decode(data: data, result: result)
} else {
// handle status code
}
} else if let error = error as NSError? {
// handle error
}
}
dataTask.resume()
return dataTask
}
Затем часть generi c завершается определением интерфейса, например,
func register(uid: String,
isAnonymous: Bool,
result: @escaping (Result<User>) -> Void) {
var request = requestFactory.register(uid: uid, isAnonymous: isAnonymous)
if let urlString = request.url?.absoluteString {
cancelExistingTask(urlString: urlString)
dataTask = performRequest(request: &request, result: result)
dataTasks[urlString] = dataTask
}
}
Как это будет выглядеть в C# и есть ли лучший способ сделать это в C# с его языковыми функциями?