このソリューションは C# と VB.NET の両方で機能しますが、ラムダ関数の VB.NET 構文はそれほどクリーンではありません。VB ではこのソリューションの魅力が低下する可能性があります。私の例は C# になります。
C# 3 のラムダ関数と式ツリー機能を使用して、必要な効果を得ることができます。基本的には、SomeFuncHelper というラッパー関数を作成し、次のように呼び出します。
MyClass objForStrongTyping = new MyClass();
SomeFuncHelper(() => objForStrongTyping.MyItem);
SomeFuncHelper は次のように実装されています。
void SomeFuncHelper(Expression<Func<object>> expression)
{
string propertyName = /* get name by examining expression */;
SomeFunc(propertyName);
}
ラムダ式() => objForStrongTyping.MyItem
は、SomeFuncHelper に渡される Expression オブジェクトに変換されます。SomeFuncHelper は Expression を調べ、プロパティ名を取り出し、SomeFunc を呼び出します。私の簡単なテストでは、次のコードはプロパティ名を取得するために機能します() => someObject.SomeProperty
。
propertyName = ((MemberExpression) ((UnaryExpression) expression.Body).Operand).Member.Name;
おそらく、式ツリーを読み、コードを操作してより堅牢なものにしたいと思うでしょうが、それが一般的な考え方です。
更新:これは Jason のソリューションに似ていますが、ヘルパー関数呼び出し内のラムダ式を (() => obj.Property
の代わりに(SomeType obj) => obj.Property
) 少し単純にすることができます。もちろん、これは、その型のインスタンスがすでに存在している場合にのみ簡単になります。