0

当我尝试在 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; }
        }
    }
}
4

3 回答 3

1

由于您知道类型,因此可以替换x.BarFoo.Bar,如下所示:

RegisterMethod<Foo, string>(x => Foo.Bar);

这应该处理错误消息。您首先看到错误的原因是,当您通过实例语法访问静态成员时,您正在向编译器发送一条混合消息。一方面,您告诉它您认为这Bar是一个成员属性;另一方面,您已将其声明为static属性。像这样的不一致通常发生在不成功的重构期间,因此编译器会触发一个错误,让您仔细检查您的代码。

于 2013-01-07T20:31:56.923 回答
1

您可以将调用重写为RegisterMethod

RegisterMethod(x => Foo.Bar);

您不需要指定类型参数,它们是使用成员推断推断出来的。

但是,您需要扩展该RegisterMethod方法以不总是假设MemberExpression.

于 2013-01-07T20:32:49.340 回答
0

要回答您的粗体问题:

问:是否有可能让 Bar 属性保持静态?

为了保持Bar静态,你必须使_bar静态。否则它甚至没有意义。

x.BarBar当是静态的时候也没有意义。你可以Bar访问Foo.Bar

静态属性不与您的类的任何特定实例相关联。只有一个静态 p 的实例


如果你需要_bar是非静态的并且Bar是静态的,那么你的设计就存在根本性的问题。

于 2013-01-07T20:32:38.013 回答