24

简单的问题,希望是一个简单的答案:

我想做以下事情:

private DateTime m_internalDateTime;
public var DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = value; } // here value is of type DateTime
}

以上只是我正在尝试做的一个例子。我想要一个 x 类型的内部变量的公共访问器。我希望将该变量作为字符串获取,但使用 x 类型的东西设置它。

这可能吗?

- 编辑 -

我刚刚意识到我可以做类似的事情:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}

但是,假设我使用类型 y 而不是“字符串”作为我的“获取”类型。如果我想在我的代码中的其他地方使用“DateTimeProperty”,我必须强制转换它。

4

6 回答 6

13

不,您显然可以在调用代码中添加 .ToString() ,但是如果没有像这样的不同名称,您将无法执行您建议的操作:

private DateTime m_internalDateTime;
public DateTime SetDateTime { set { m_internalDateTime = value; } }
public string GetDateTime   { get { return m_internalDateTime.ToString(); } } 

或者,甚至更好地使用方法而不是属性(如评论中所述):

private DateTime m_internalDateTime;
public void SetDateTime(DateTime dateTime) { m_internalDateTime = dateTime; }
public string GetDateTime() { return m_internalDateTime.ToString(); }

请记住,这var是针对隐式的、编译时类型的变量,而不是动态变量。

绝对不要做你在编辑中提到的。它引入了对惯例的突破、可能的性能影响(尽管很小)和重大的本地化问题。

于 2009-06-09T18:34:26.253 回答
6

作为财产,不,这是不可能的。您可以创建不同类型的 Get 和 Set 方法,但对于属性,类型必须相同。

编辑:

尽管:

private DateTime m_internalDateTime;
public object DateTimeProperty
{
   get { return m_internalDateTime.ToString(); } // Return a string
   set { m_internalDateTime = (DateTime)value; } // here value is of type DateTime
}

在语法上是正确的,将编译并允许您接受 DateTime 作为输入并返回一个字符串,这不是一个好计划。它有效,但它使您和任何访问此代码的人都执行不必要的验证。此外,它在未来容易受到其他开发人员的攻击,他们不知道或意识到隐含规则,因此您失去了编译时安全性。此外,几乎不再需要任何代码来以强类型的方式创建两个属性或实现相同目标的两个方法。

就个人而言,我建议使用两种方法(请参阅 Jeff Yates 评论以获得关于原因的良好解释)。

private DateTime m_internalDateTime;
public string GetDateTime()
{
    return m_internalDateTime.ToString();
}

public void SetDateTime(DateTime dateTime)
{
    m_internalDateTime = dateTime;
}
于 2009-06-09T18:33:19.407 回答
4

不是这样,但您当然可以拥有第二个访问 m_internalDateTime 字段的属性。

public string DateTimeString
{
   get { return m_internalDateTime.ToString(); }
}
于 2009-06-09T18:33:47.657 回答
3

也许这有帮助

public class TDecimal
{
    private decimal? m_value;
    public bool HasValue { get { return m_value.HasValue; } }
    public decimal Value { get { return m_value.Value; } }

    public static implicit operator TDecimal(string a_value)
    {
        decimal d;
        if (decimal.TryParse(a_value, out d))
        {
            return new TDecimal() {m_value = d};
        }

        return new TDecimal() {m_value = null};
    }

    public static implicit operator decimal(TDecimal a_value)
    {
        if(a_value.HasValue)
        {
            return a_value.Value;
        }

        throw new ArgumentNullException("a_value");
    }
}

public class A
{
    public TDecimal Prop { get; set; }
}


A a = new A();

a.Prop = "123";
if (a.Prop.HasValue)
{
    decimal d = a.Prop;
}
于 2010-03-25T12:26:38.470 回答
0

简单的回答不,对于您的外部代码,您的属性将与字段的行为完全相同,您不能拥有具有不同设置/获取类型的属性,就像您不能使用类型设置文件一样,并且当您请求它的值得到不同的类型。

于 2009-06-09T18:36:42.240 回答
0

怎么样:

private DateTime intDT;
public string DateTimeProperty
{   
      get { return intDT.ToString(); } // Return a string   
      set 
      { 
         DateTime dt;
         if (DateTime.TryParse(value, out dt))
             intDT = dt;
         else throw new ArgumentException(string.Format(
           "{0} cannot be converted to a DateTime.", value);           
      } 
}
于 2009-06-09T20:11:45.073 回答