У меня есть абстрактный класс, который я использую для хранения информации о токенах OAuth:
public abstract class Provider
{
private readonly string _accessToken;
private readonly string _refreshToken;
private readonly JsonMeta _providerMeta;
protected Provider(TokenProfile profile)
{
_accessToken = profile.AccessToken;
_refreshToken = profile.RefreshToken;
_providerMeta =
JsonConvert.DeserializeObject<JsonMeta>(profile.JsonMeta);
}
protected class JsonMeta {}
}
Я использую этот базовый класс для создания подклассов с более конкретными свойствами:
public class SalesforceProvider : Provider
{
public SalesforceProvider(TokenProfile profile) : base(profile)
{
}
//Get unique information from the Json
protected new class JsonMeta
{
public string instance_url;
public string token_type;
public string id_token;
}
//Salesforce calls must be made to a specific server associated
//with the users account. Most OAuth calls contain unique
//metadata like this in their responses that is needed to
//use their service
public string SomeData()
{
return Salesforce.Leads(_providerMeta.instance_url);
}
}
Однако вышеописанное не работает, поскольку JsonMeta
реализована в абстрактном классе, а свойства, реализованные в классе, не существуют до тех пор, пока мы не перейдем к производному классу, поэтому объект JsonMeta
в производном классе лишен свойств.
Но моя проблема заключается в том, что имя класса и экземпляры будут одинаковыми для каждого производного класса, это просто свойства, которые будут меняться в зависимости от метаданных в возврате JSON.
Итак, мой вопрос: могу ли я иметь пустой класс в своем тезисе, который создается в абстрактном конструкторе, чтобы уменьшить повторение, но делает это со свойствами, присутствующими в производном классе?
Если нет, каков наилучший способ сделать что-то подобное?
Сделайте реферат JsonMeta.
public abstract class Provider
{
private readonly JsonMeta _providerMeta;
protected Provider(TokenProfile profile, JsonMeta json)
{
// do stuff with JsonMeta object
}
protected abstract class JsonMeta { }
}
public class SalesforceProvider : Provider
{
public SalesforceProvider(TokenProfile profile)
: base(profile, new SalesforceJson())
{ }
private class SalesforceJson : JsonMeta
{
// Salesforce-specific stuff
}
}
Это позволяет создавать разные реализации JSON для разных типов, но при этом абстрагироваться от использования их базовым классом Provider
.
Что-то вроде этого (я не знал, какой тип профиля. JsonMeta был.)
public abstract class Provider
{
private readonly string _accessToken;
private readonly string _refreshToken;
private readonly object _jsonMeta;
protected Provider(TokenProfile profile)
{
_accessToken = profile.AccessToken;
_refreshToken = profile.RefreshToken;
_jsonMeta = profile.JsonMeta;
}
protected JsonMeta ProviderMeta
{
get
{
return JsonConvert.DeserializeObject<JsonMeta>(_jsonMeta); ;
}
}
protected class JsonMeta { }
}