从属性调用方法

时间:2016-01-24 14:35:37

标签: c#

因为我们可以将属性声明为

class A
{
    private int x;

    public int X 
    {
        get
        {
            return x;
        }

        set
        {
            x = value;
        }

        //Create methods in here
    }
    ...
}

是否可以在这些属性中创建方法,以便您可以直接调用该方法?

A a = new A();
a.X.SomeMethod();  //Do something with X

而不是

A a = new A();
A.SomeMethod(a);

4 个答案:

答案 0 :(得分:1)

您只能通过其object来调用方法,在您的情况下,您无法从int调用该方法,您可以执行inherit来自int类,在类中创建方法并将属性类型放到新创建的类中并调用方法

public class NewType : int
{
    public void SomeMethod()
    {

    }
}

class A
{
    private NewType x;

    public NewType X
    {
        get
        {
            return x;
        }

        set
        {
            x = value;
        }
    }
}

而且你可以做到以下几点:

 A a = new A();
 a.X.SomeMethod();

希望帮助

答案 1 :(得分:1)

  

是否可以在这些属性中创建方法,以便您可以直接调用该方法?

一方面,是的,这是可能的,你可以,但另一方面,不是在c#。

Standard ECMA-335, Common Language Infrastructure (CLI)第II.17节明确指出:

  

属性可以包含任意数量的方法。

这意味着您最多只能创建一个.get.set方法,但可以创建尽可能多的.other方法。

这个名为count的属性示例也可以在II.17中找到:

.class public auto autochar MyCount extends [mscorlib]System.Object { 
  .method virtual hidebysig public specialname instance int32 get_Count() { 
  // body of getter 
  } 
  .method virtual hidebysig public specialname instance void set_Count(int32 newCount) { 
  // body of setter 
  } 
  .method virtual hidebysig public instance void reset_Count() { 
  // body of refresh method 
  } 
  // the declaration of the property 
  .property int32 Count() { 
    .get instance int32 MyCount::get_Count() 
    .set instance void MyCount::set_Count(int32) 
    .other instance void MyCount::reset_Count() 
  } 
}

由于c#不知道.other方法的概念,您将无法创建这样的方法,也无法直接调用它。只有通过反思才能调用它。

答案 2 :(得分:0)

不,这在C#中是不可能的,但CLI指定了​​.other方法。

Properties用于支持封装的OOP原则。它们可以像公共数据成员一样使用,但它们实际上是称为访问者的特殊方法。

public String S;

可以用以下属性表示:

public String S { get; set; }

这只是

的简写版本
public String S { get { return s; } set { s = value; } }

get { }set { }内,您可以进行验证等。

在属性中,只允许 get set 作为方法(称为访问者

通过财产访问公共成员

myVar.S // of type string

使您可以调用字符串允许的所有方法,例如

string sub = myVar.S.Substring(1);

答案 3 :(得分:0)

如果返回类型是内置类型(而不是自定义类),则可以为此类型的所有创建Extension Method

试试这段代码:

public class A
{
    public int X { get; set; }
}

static class Extensions
{
    public static bool IsEven(this int x)
    {
        return x%2==0;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var a=new A() { X=32 };

        if (a.X.IsEven())
        {
        }
    }
}