如何设置静态属性并从父级读取

时间:2014-09-26 04:54:42

标签: c# activerecord xamarin.ios xamarin xamarin.android

我想要实现的是这个

// Base class
public Class ActiveRecord {
   public static string CollectionName;

   public static Collection() {
       return CollectionInstance(CollectionName); // just pseudo code
   }
}

// Child class
public Class Post : ActiveRecord
{
   public static string CollectionName = "posts"; 
}

我知道php AR是以这种方式工作的(也许是红宝石),但不知道如何在C#中实现这一点,还是有另一种方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

从mu的理解,你不能覆盖c#中的静态属性。

如果要覆盖它,则需要将其更改为实例属性,然后才能覆盖它。

// Base class
public Class ActiveRecord {
   public virtual string CollectionName {get;}

   public static Collection() {
       return CollectionInstance(CollectionName); // just pseudo code
   }
}

// Child class
public Class Post : ActiveRecord
{
   public override string CollectionName { get{ return "posts";}}
}

答案 1 :(得分:0)

您无法使用静态字段或静态构造函数执行此操作。请注意,在C#中,静态构造函数的执行顺序为not under your control

  

用户无法控制程序中何时执行静态构造函数。

因此,您无法保证派生的构造函数将首先执行并设置CollectioName。

此外,您尝试做的事情是不可能的,因为在调用任何派生的构造函数之前,首先执行基础构造函数。

此外,您无法从构造函数返回任何内容,因此该语句无效:

return CollectionInstance(CollectionName); // just pseudo code

你可以做的是:

// Base class
public class ActiveRecord {

   public ActiveRecord(string name) {
       CollectionInstance = new CollectionInstance(name); // just pseudo code
   }
}

// Child class
public class Post : ActiveRecord
{
   public Post(): base("posts"){}
}

或者这个:

// Child class
public class Post : ActiveRecord
{  
   private static readonly string CollectionName = "posts";
   public Post(): base(CollectionName){}
}