是否可以使用其他变量类型设置类变量

时间:2019-03-23 22:06:38

标签: c# class

是否可以为c#变量设置与变量类型设置不同的变量类型值?

public class Test{

   public DateTime TimeSinceEpoch {
      get {return TimeSinceEpoch; }
      set{ 
         DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
         TimeSinceEpoch = Epoch.AddMilliseconds(value);}} //<-the value that's expected is a DateTime value..
}

  

我该怎么写:   'TimeSinceEpoch = 1549090800000'   并将TimeSinceEpoch用作普通的DateTime变量?

无需在类内单独获取和设置变量

5 个答案:

答案 0 :(得分:1)

即使在具有 语法的C ++ / CLI中也不允许这样做:

public ref struct Test
{
    property System::DateTime TimeSinceEpoch
    {
        DateTime get();
        void set(DateTime);
        void set(long long);
    }
};

您收到以下错误:

  

错误C3902:'设置':最后一个参数的类型必须为'System :: DateTime'

Intellisense实际上会产生两个投诉,具体取决于您编写投诉的顺序:

  

E1930:已经在此属性中声明了“设置”访问器

  

E1942:“设置”访问器的最后一个参数与属性类型不匹配

潜在的问题是.NET属性必须在元数据中列出类型和最多一个设置器(请查看PropertyInfo.GetSetMethod -它返回一个设置器或null,而不是数组)。即使您可以轻松地重载setter函数本身,也可以:

void set_TimeSinceEpoch(DateTime)
void set_TimeSinceEpoch(long)

这两个功能中只有一个可以与该属性相关联。

您可以使用助手类型来允许多种传入类型:

struct SuperDateTime
{
    public DateTime Value;
    public static implicit operator SuperDateTime(DateTime d) { return new SuperDateTime { Value = d }; }
    public static implicit operator SuperDateTime(long x) { return new SuperDateTime { Value = Epoch.AddMilliseconds(x) }; }
    public static implicit operator DateTime(SuperDateTime d) { return d.Value; }
}

但这会破坏该属性的读者,该属性的读者现在必须在使用成员之前说TimeSinceEpoch.Value(如果将其作为参数传递给另一个函数,则隐式转换将开始)。为了克服这个问题,您需要为DateTime的每个成员编写转发功能。

答案 1 :(得分:0)

您需要一个DateTime的私有变量和一个long属性。参见下面的代码:

    public class Test
    {

       private DateTime Epoch { get;set; }
       public long TimeSinceEpoch {
          get {return  Epoch.Ticks; }
          set{ 
             DateTime temp = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
             Epoch = temp.AddMilliseconds(value);
          } 
        }
    }

答案 2 :(得分:0)

您可以按照自己的方式使用它并获得毫秒数:

var ms = (TimeSinceEpoch - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)).TotalMilliSeconds;

或为其创建扩展方法,例如:

public static class Extensions
{
     public static long MilliSeccondsSinceEpoch(this DateTime d)
     {
         DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
         return (d - Epoch).TotalMillisecond;
     }
}

然后您可以像使用它一样

TimeSinceEpoch = DateTime.Now;
var ms = TimeSinceEpoch.MilliSeccondsSinceEpoch();

答案 3 :(得分:0)

以下代码按我的意愿工作。希望它能帮助其他人

public class Test{
   private DateTime Time {get;set;}
   public object TimeSinceEpoch {
      get{
         return (DateTime)Time
      }
      set{
         DateTime x = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
         Time = x.AddMilliseconds(Convert.ToDouble(value));
      }
   }
}

答案 4 :(得分:0)

您可以使用隐式强制转换来实现此目的:

public struct EpochBasedDateTime
{
    public EpochBasedDateTime(DateTime value) => Value = value;
    public EpochBasedDateTime(int milliseconds)
        : this(Epoch.addMilliseconds(milliseconds)
    {
    }

    public static readonly DateTime Epoch = new DateTime(1970,1,1);
    public DateTime Value {get;}
    public static implicit operator EpochBasedDateTime (int milliseconds)
       => new EpochBasedDateTime(milliseconds);
    public static implicit operator DateTime (EpochBasedDateTime date)
       => date.Value;
}

所以你可以

public class Test
{
    public EpochBasedDateTime TimeSinceEpoch {get; set;}
}

var test = new Test();
test.TimeSinceEpoch =  12345;
DateTime dt = test.TimeSinceEpoch;

但是,最好使用实用程序方法将数字显式转换为日期:

public static class Epoch
{
    public static readonly DateTime Value {get;} = new DateTime(1970,1,1);
    public static DateTime AddMilliseconds(ms)
        => Value.AddMilliseconds(ms);            
}

所以你可以

DateTime foo = Epoch.AddMilliseconds(12345);

DateTime foo = Epoch.Value.AddMilliseconds(12345);