Método de extensión para obtener atributos personalizados de C#.
¿Alguien puede ayudarme a crear un método de extensión para atributos personalizados de Newtonsoft.Json y MongoDB?
Digamos que tengo la siguiente clase:
public class Foo
{
[BsonElement("MyCustomDbName")]
[JsonProperty("MyCustomJsonName")]
public string Name { get; set; }
}
¿Cómo se crea un método de extensión para obtener lo siguiente?
var myFoo = new Foo(){Name=""};
var mongoDbElementName = myFoo.Name.GetMongoDbElementName(); // debería devolver 'MyCustomDbName'
var jsonPropertyName = myFoo.Name.GetJsonPropertyName(); // debería devolver 'MyCustomJsonName'
O directamente con la propia clase:
var mongoDbElementName = Foo.Name.GetMongoDbElementName(); // debería devolver 'MyCustomDbName'
var jsonPropertyName = Foo.Name.GetJsonPropertyName(); // debería devolver 'MyCustomJsonName'
He intentado cosas como esta:
public static string GetMongoDbElementName(this Type modelType, PropertyInfo property)
{
return (modelType.GetProperty(nameof(property)) ?? throw new InvalidOperationException()).GetCustomAttribute<bsonelementattribute>()?.ElementName;
}
Pero ¿hay alguna forma de hacerlo sin parámetros?
Gracias de antemano
davy.ai
Sí, es posible crear métodos de extensión para atributos personalizados en Newtonsoft.Json y MongoDB sin pasar ningún parámetro. Aquí tienes un ejemplo:
En este ejemplo, utilizamos expresiones lambda para obtener la información de la propiedad sin pasar ningún parámetro. El método
GetPropertyInfo
extrae el objetoPropertyInfo
de la expresión lambda y lanza una excepción si la expresión es inválida.Los métodos
GetBsonElementName
yGetJsonPropertyName
utilizan el objetoPropertyInfo
para recuperar los atributos BsonElement y JsonProperty y sus nombres respectivos.Para utilizar estos métodos de extensión, puedes llamarlos directamente en la propiedad, de esta manera:
Alternativamente, puedes utilizar expresiones lambda para obtener el nombre de la propiedad, de esta manera:
csharp
</t,></t,></t,>var myFoo = new Foo() { Name = "" };
var mongoDbElementName = myFoo.GetMongoDbElementName(f => f.Name);
var jsonPropertyName = myFoo.GetJsonPropertyName(f => f.Name);