La respuesta corta es no.
Respuesta más larga: Para que una clase sea compatible con los inicializadores de recopilación, debe implementar IEnumerable y debe tener un método de agregar. Así, por ejemplo:
public class MyClass<T,U> : IEnumerable<T>
{
public void Add(T t, U u)
{
}
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
puedo entonces hacer esto:
var mc = new MyClass<int, string> {{1, ""}, {2, ""}};
así que el uso de esta, vamos a tratar de hacer que funcione para un atributo. (Nota al margen, ya que los atributos no son compatibles con los genéricos, sólo estoy hardcoding que el uso de cadenas para la prueba):
public class CollectionInitAttribute : Attribute, IEnumerable<string>
{
public void Add(string s1, string s2)
{
}
public IEnumerator<string> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Y ahora para probarlo:
[CollectionInit{{"1","1"}}]
public class MyClass
{
}
y que no se compila :(No estoy seguro de dónde está exactamente la limitación, supongo que los atributos no se renuevan del mismo modo que un objeto común y, por lo tanto, no es compatible. Me gustaría saber si esto puede ser apoyado teóricamente por una versión futura del lenguaje ...
Scott, lo siento - Mi respuesta es no. No me gano el voto. Por favor vote abajo porque es un juego limpio. – vladimir77
@ vladimir77 - ¡No debería haber borrado su respuesta! A veces la respuesta incorrecta sigue siendo útil ... simplemente actualice su respuesta la próxima vez, para que la gente pueda entender por qué está mal. –
Ok. :) Lo he restaurado. – vladimir77