primitivas personalizados em C #?
Pergunta
Além da utilidade questionável a isso, eu gostaria de perguntar se é possível fazer algo ao longo destas linhas.
class MyPrimitive {
String value;
public String Value {
get { return value; }
set { this.value = value; }
}
}
// Instead of doing this...
MyPrimitive a = new MyPrimitive();
a.Value = "test";
String b = a.Value;
// Isn't there a way to do something like this?
MyPrimitive a = "test";
String b = a;
Eu gosto de envolver tipos primitivos em classes personalizadas usando uma propriedade para fazer o método get
e set
realizar outras coisas, como validação.
Desde que eu estou fazendo isso muitas vezes eu pensei que seria bom ter também uma sintaxe mais simples, como para as primitivas padrão.
Ainda assim, eu suspeito que este não só não é viável, mas também poderia ser conceitualmente errado.
Qualquer idéias seria muito bem-vinda, obrigado.
Solução
Use um tipo de valor (struct
) e dar-lhe uma href="http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx" rel="noreferrer"> operador de conversão implícita do tipo que você deseja no lado direito da atribuição.
struct MyPrimitive
{
private readonly string value;
public MyPrimitive(string value)
{
this.value = value;
}
public string Value { get { return value; } }
public static implicit operator MyPrimitive(string s)
{
return new MyPrimitive(s);
}
public static implicit operator string(MyPrimitive p)
{
return p.Value;
}
}
EDIT:. Feito o imutável struct porque Marc Gravell é absolutamente certo
Outras dicas
Você pode usar conversão implícita ??em>. Não é recomendado, mas:
public static implicit operator string(MyString a) {
return a.Value;
}
public static implicit operator MyString(string a) {
return new MyString { value = a; }
}
Mais uma vez, má prática.