gpt4 book ai didi

c# - 访问类成员的类型安全枚举

转载 作者:太空狗 更新时间:2023-10-30 00:25:05 24 4
gpt4 key购买 nike

我的类(class) MyClass<t>有以下方法

private static bool TypeHasProperty(string NameOfPropertyToMatch)
{
var properties = typeof(t).GetProperties();
var requiredProperty = properties.First(
a => a.Name == NameOfPropertyToMatch);
if (requiredProperty == null)
{
return false
};

return true;
}

这是在静态方法开始时调用的:

MyClass<t>.SendToJavaScript(t InstanceOfType, string NameOfPropertyWithinType) .

确保InstanceOfType在继续之前实际上具有该名称的属性,因为否则直到 waaaaay 才会抛出异常(此信息最终将被序列化并发送到 Javascript 应用程序,该应用程序需要知道要访问哪个属性才能完成其工作)。

我想要一种好的、类型安全的方法来调用该方法,如果我决定稍后更改我的属性名称,该方法不会导致验证失败。

例如,我不想这样调用它:

MyClass<Person>.SendToJavaScript(MyPerson, "Name")

因为如果我决定改变 NameLastName,Person类里面,我必须确保进来改变那个神奇的字符串。

我想要的是这样的:

MeClass<Person>.SendToJavaScript(
MyPerson,
TypeOf(Person).Properties.Name.ToString())

这样,如果我使用重构来更改 NameLastName ,IDE 将扫过那里并更改我的调用。

这样的东西存在吗?还是我在重构时只需要小心? (我爱我一些 F2 )

最佳答案

我们在代码中使用这样的东西:

private static bool TypeHasProperty<P>(Expression<Func<T, P>> accessor)
{
var propertyName = ((MemberExpression)accessor.Body).Member.Name;
var properties = typeof(T).GetProperties();
return properties.Any(a => a.Name == propertyName);
}

使用它:

class Foo
{
public int Baz { get; set; }
}

MyClass<Foo>.TypeHasProperty(f => f.Baz);

编辑:将查询更改为使用 Any(),因为它能更好地表达您实际想要做的事情(是否存在具有给定名称的属性?)

请注意,如果未找到匹配项,First() 将抛出异常。

关于c# - 访问类成员的类型安全枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19169603/

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