Jey*_*han 10 .net c# vb.net strong-typing
假设我有一个属性有一个属性
Public Class MyClass
Public Property MyItem() as Object
....
End Property
End Class
Run Code Online (Sandbox Code Playgroud)
我必须将属性的名称传递给函数调用.(请不要问为什么要这样做,它是第三方框架).例如
SomeFunc("MyItem")
Run Code Online (Sandbox Code Playgroud)
但我想要做的是,将字符串更改为强类型参数.这意味着,如果重命名或更改属性名称,也应该在此处反映出来.
所以这种类型的东西:
Dim objectForStrongTyping as New MyClass()
SomeFunc(objectForStrongTyping.MyItem().Name())
Run Code Online (Sandbox Code Playgroud)
我相信这不会奏效.有没有办法可以完成这种强力打字?(C#或VB.NET,任何事情都很酷)
jas*_*son 21
这是一个使用类的解决方案System.Linq.Expressions.
static MemberInfo GetMemberInfo<TObject, TProperty>(
Expression<Func<TObject, TProperty>> expression
) {
var member = expression.Body as MemberExpression;
if (member != null) {
return member.Member;
}
throw new ArgumentException("expression");
}
Run Code Online (Sandbox Code Playgroud)
把它扔到某个地方(ExpressionHelper?).
用法:
class SomeClass {
public string SomeProperty { get; set; }
}
MemberInfo member = GetMemberInfo((SomeClass s) => s.SomeProperty);
Console.WriteLine(member.Name); // prints "SomeProperty" on the console
Run Code Online (Sandbox Code Playgroud)
在C#6.0中有一个名为nameof的新功能.基本上你可以这样做:
var name = nameof(MyClass.MyItem);
Run Code Online (Sandbox Code Playgroud)
查看从C#到VB的Telerik代码转换器,它似乎是VB的等价物:
Dim name = nameof([MyClass].MyItem)
Run Code Online (Sandbox Code Playgroud)
所以你可以做到以下几点:
SomeFunc(nameof(MyClass.MyItem));
Run Code Online (Sandbox Code Playgroud)
以下是对microsoft文档的引用:https: //docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/nameof
| 归档时间: |
|
| 查看次数: |
3556 次 |
| 最近记录: |