有人可以幫助我為 newtonsoft.json 和 mongodb 的自定義屬性創建擴展方法嗎?
假設我有以下課程:
public class Foo
{
[BsonElement("MyCustomDbName")]
[JsonProperty("MyCustomJsonName")]
public string Name { get; set; }
}
如何創建擴展方法以獲取以下內容:
var myFoo = new Foo(){Name=""};
var mongoDbElementName = myFoo.Name.GetMongoDbElementName(); // should return 'MyCustomDbName'
var jsonPropertyName = myFoo.Name.GetJsonPropertyName(); // should return 'MyCustomJsonName'
或直接與類本身:
var mongoDbElementName = Foo.Name.GetMongoDbElementName(); // should return 'MyCustomDbName'
var jsonPropertyName = Foo.Name.GetJsonPropertyName(); // should return 'MyCustomJsonName'
我試過這樣的東西:
public static string GetMongoDbElementName(this Type modelType, PropertyInfo property)
{
return (modelType.GetProperty(nameof(property)) ?? throw new InvalidOperationException()).GetCustomAttribute<BsonElementAttribute>()?.ElementName;
}
但是有沒有辦法在沒有引數的情況下做到這一點?
提前感謝
uj5u.com熱心網友回復:
你不能直接在財產上這樣做;您需要將擴展??方法應用于類并使用運算式來選擇屬性:
public static string GetMongoDbElementName<T>(
this T obj,
Expression<Func<T, object>> propertySelector)
{
var memberExpression = propertySelector.Body as MemberExpression;
var memberName = memberExpression?.Member.Name
?? throw new InvalidOperationException();
var bsonAttribute = obj
.GetType()
.GetProperty(memberName)
.GetCustomAttribute<BsonElementAttribute>();
return bsonAttribute?.ElementName;
}
用法:
var mongoDbElementName = myFoo.GetMongoDbElementName(x => x.Name);
您可能還想更新代碼以防止選擇其他成員(例如方法),可以這樣做:
var property = obj
.GetType()
.GetProperty(memberName)
?? throw new InvalidOperationException($"{memberName} is not a property");
var bsonAttribute = property
.GetCustomAttribute<BsonElementAttribute>();
uj5u.com熱心網友回復:
您可以使用反射獲取屬性及其值:
public static string GetBsonElementName(this Foo foo)
{
var bsonElementAttribute =
typeof(Foo)
.GetProperty(nameof(Foo.Name))
.GetCustomAttribute<BsonElementAttribute>();
return bsonElementAttribute.ElementName;
}
public static string GetJsonPropertyName(this Foo foo)
{
var jsonPropertyAttribute =
typeof(Foo)
.GetProperty(nameof(Foo.Name))
.GetCustomAttribute<JsonPropertyAttribute>();
return jsonPropertyAttribute.PropertyName;
}
你像這樣使用它:
var foo = new Foo();
var bsonElementName = foo.GetBsonElementName();
var jsonPropertyName = foo.GetJsonPropertyName();
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377421.html
