是否可以为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变量?
无需在类内单独获取和设置变量
答案 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);