因为我们可以将属性声明为
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);
答案 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())
{
}
}
}