当我尝试在RegisterMethod中传入x.Bar时,我收到以下错误。
使用实例引用无法访问成员'TestProject2.Foo.Bar.get';使用类型名称来限定它
问。是否可以将Bar属性保持静态?
namespace TestProject2
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
RegisterMethod<Foo, string>(x => x.Bar); <-- error here
}
static void RegisterMethod<TSelf, TProp>(Expression<Func<TSelf, TProp>> expression)
{
var member_expression = expression.Body as MemberExpression;
if (member_expression == null)
return;
var member = member_expression.Member;
if (member.MemberType != MemberTypes.Property)
return;
var property = member as PropertyInfo;
Console.WriteLine(property.Name);
Console.WriteLine(property.DeclaringType);
}
}
public class Foo
{
private string _bar;
public static string Bar <-- would very much want to keep this static
{
get { return _bar; }
set { _bar = value; }
}
}
}
答案 0 :(得分:1)
由于您知道类型,因此可以将x.Bar
替换为Foo.Bar
,如下所示:
RegisterMethod<Foo, string>(x => Foo.Bar);
这应该处理错误消息。您首先看到错误的原因是,当您通过实例语法访问静态成员时,您正在向编译器发送混合消息。一方面,你告诉它你认为Bar
是会员财产;另一方面,您已将其声明为static
属性。这种不一致通常发生在不成功的重构期间,因此编译器会触发错误,让您仔细检查代码。
答案 1 :(得分:1)
您可以将呼叫重写为RegisterMethod
:
RegisterMethod(x => Foo.Bar);
您不需要指定类型参数,它们是使用成员推断推断出来的。
但是,您需要将RegisterMethod
方法扩展为不总是假设MemberExpression
。
答案 2 :(得分:0)
回答你粗体问题:
问。是否可以保持Bar属性静态?
为了保持Bar
静态,您必须使_bar
成为静态。否则它甚至没有意义。
x.Bar
是静态时, Bar
没有意义。您可以使用Bar
Foo.Bar
静态属性与您的类的任何特定实例无关。静态p只有一个实例
如果您需要_bar
为非静态且Bar
是静态的,那么您的设计就会出现根本性的问题。