将静态属性传递给Generic输入参数

时间:2013-01-07 20:29:31

标签: c#

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

3 个答案:

答案 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是静态的,那么您的设计就会出现根本性的问题。