Estoy tratando de hacer un método que vaya a través de una lista de objetos genéricos y reemplazar todas sus propiedades del tipo string
que es o vacío con un reemplazo.C#: Cómo obtener todas las propiedades de cadena públicas (tanto obtener y establecer) de un tipo
¿Cómo es una buena manera de hacer esto?
tengo este tipo de concha ... ... hasta ahora:
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement)
{
var properties = typeof(T).GetProperties(-- What BindingFlags? --);
foreach(var p in properties)
{
foreach(var item in list)
{
if(string.IsNullOrEmpty((string) p.GetValue(item, null)))
p.SetValue(item, replacement, null);
}
}
}
Así que, ¿cómo puedo encontrar todas las propiedades de un tipo que son:
- De tipo
string
- Ha pública
get
Ha pública
set
?
Hice esta clase de prueba:
class TestSubject
{
public string Public;
private string Private;
public string PublicPublic { get; set; }
public string PublicPrivate { get; private set; }
public string PrivatePublic { private get; set; }
private string PrivatePrivate { get; set; }
}
La siguiente no funciona:
var properties = typeof(TestSubject)
.GetProperties(BindingFlags.Instance|BindingFlags.Public)
.Where(ø => ø.CanRead && ø.CanWrite)
.Where(ø => ø.PropertyType == typeof(string));
Si imprimo el nombre de aquellas propiedades que consigo allí, consiga:
PublicPublic público- PrivatePublic
En otras palabras, me sale dos propiedades demasiado.
Nota: Esto probablemente se podría hacer de una manera mejor ... usando foreach y reflexión anidada y todos aquí ... pero si tiene alguna grandes ideas alternativas, por favor hágamelo saber porque yo ¡querer aprender!
En primer lugar, su ejemplo reemplazará los valores * todo * y, en segundo lugar, la propiedad CanWrite no parece funcionar de la manera que pensamos que sería ... =/ – Svish
El CanWrite funciona de la manera que debería. ¿Puedes explicar qué te hace pensar lo contrario? –
Como muestra mi ejemplo, una propiedad pública que se declara como i.e.cadena pública Something {get; private set;}, devolverá true para CanRead y CanWrite, aunque no debería poder escribir, ya que el setter es privado. – Svish