gpt4 book ai didi

c# - 自定义属性的扩展方法

转载 作者:行者123 更新时间:2023-11-30 17:52:47 24 4
gpt4 key购买 nike

我在 ASP.net MVC4 网站上工作,并且有模型和 View 模型层。 由于某些原因我在 Model 和 ViewModel 中的几个属性有不同的名称

型号

public partial class Project
{
public string Desc {get; set;}
}

查看模型

public class ProjectViewModel
{
public string Description { get; set; }
}

现在在模型层,如果属性不同,我需要使用属性的 ViewModel 名称。我正在考虑创建一个自定义属性,以便我可以在模型中拥有类似的东西:

public partial class Project
{
[ViewModelPropertyName("Description")]
public string Desc {get;set;}
}

并在模型层使用它作为

string.Format("ViewModel Property Name is {0}", this.Desc.ViewModelPropertyName())

我希望它是通用的,这样如果属性上没有 ViewModelPropertyName 属性,那么它应该返回相同的属性名称,即如果 Desc 属性没有属性,那么它应该只返回 "Desc"

这是我尝试过的

public class ViewModelPropertyNameAttribute : System.Attribute
{
#region Fields

string viewModelPropertyName;

#endregion

#region Properties

public string GetViewModelPropertyName()
{
return viewModelPropertyName;
}

#endregion

#region Constructor

public ViewModelPropertyNameAttribute(string propertyName)
{
this.viewModelPropertyName = propertyName;
}

#endregion
}

需要有关如何访问自定义属性的帮助

当前状态

    public static class ModelExtensionMethods
{
public static string ViewModelPropertyName(this Object obj)
{
// ERROR: Cannot convert from 'object' to 'System.Reflect.Assembly'
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(obj);

foreach (System.Attribute attr in attrs)
{
if (attr is ViewModelPropertyNameAttribute)
{
return ((ViewModelPropertyNameAttribute)attr).GetViewModelPropertyName();
}
}

return string.Empty;
}
}

但这有编译时错误:

最佳答案

不幸的是,您无法通过反射(reflect)属性本身的类型来获取您用来装饰属性的属性。因此,我稍微修改了您的 ViewModelPropertyName(this object) 扩展方法,以采用您想要的属性的名称。

此方法现在将接受您希望获取其属性的属性的名称。如果该属性存在,它将返回传递给其构造函数的值,另一方面,如果它不存在,它将只返回您传入的属性的名称。

public static class ModelExtensionMethods
{
public static string ViewModelPropertyName(this object obj, string name)
{
var attributes = obj.GetType()
.GetCustomAttributes(true)
.OfType<MetadataTypeAttribute>()
.First()
.MetadataClassType
.GetProperty(name)
.GetCustomAttributes(true);

if (attributes.OfType<ViewModelPropertyNameAttribute>().Any())
{
return attributes.OfType<ViewModelPropertyNameAttribute>()
.First()
.GetViewModelPropertyName();
}
else
{
return name;
}
}
}

您还可以定义以下类来测试这种新方法。

[MetadataType(typeof(TestClassMeta))]
class TestClass { }

class TestClassMeta
{
[ViewModelPropertyName("TheName")]
public string FirstName { get; set; }

public string LastName { get; set; }
}

此外,正如您从以下代码行中看到的,您的 ViewModelPropertyName(this object, string) 扩展方法现在将在您的 TestClass 实例上调用,而不是在属性(property)本身。

class Program
{
static void Main()
{
Console.WriteLine(new TestClass().ViewModelPropertyName("FirstName"));
Console.WriteLine(new TestClass().ViewModelPropertyName("LastName"));

Console.Read();
}
}

关于c# - 自定义属性的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18112802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com