两个setter / getter为同一个成员变量

时间:2016-02-10 13:21:31

标签: c# properties

我在C#类中有私有成员变量,如下所示:

class foo{
    private byte bar;
}

我想制作两个(或更多)setter / getter:

class foo{
    private byte bar;

    public int Bar{
        get{return (int)bar;}
        set{bar=(byte)bar;}
    }    

    public string Bar{
        get{return "Nothing";}
        set{bar=0;}
    }
}

这可能吗?或任何其他等效模式?

3 个答案:

答案 0 :(得分:4)

从技术上讲,您可以通过隐式运算符 模仿此类行为:

byte b = 123;
Random r = new Random();
int bitNumber = r.Next(32);
var bit = (b & (1 << bitNumber-1)) != 0;

现在,让我们玩得开心:

  public struct Bar {
    internal Bar(Byte value) {
      Value = value;
    }

    internal Bar(String value) {
      if (String.Equals(value, "Nothing", StringComparison.OrdinalIgnoreCase))
        Value = 0;
      else
        Value = Byte.Parse(value);
    }

    public Byte Value {
      get;
      private set;
    }

    public override string ToString() {
      return Value == 0 ? "Nothing" : Value.ToString();
    }

    public static implicit operator Byte (Bar value) {
      return value.Value;
    }

    public static implicit operator String(Bar value) {
      return value.ToString();
    }

    public static implicit operator Bar(Byte value) {
      return new Bar(value);
    }

    public static implicit operator Bar(String value) {
      return new Bar(value);
    }
  }

  class Foo {
    private Bar m_Bar;

    public Bar Bar {
      get {
        return m_Bar;
      }
      set {
        m_Bar = value;
      }
    }
  }

但是,即使你可以这样做,你最好做,只是声明两个不同名称的属性。

答案 1 :(得分:1)

不,那是不可能的。你可以做的最接近的事情可能是这样的:

<?php

namespace Illuminate\Support\Facades;

/**
 * @see \Illuminate\Http\Request
 */
class Input extends Facade
{
    /** 
     * Get an item from the input data.
     *
     * This method is used for all request verbs (GET, POST, PUT, and DELETE)
     *
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    public static function get($key = null, $default = null)
    {   
        return static::$app['request']->input($key, $default);
    }   

    /** 
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {   
        return 'request';
    }   
}

当然,此解决方案尚未完成,因为如果值不兼容,您可能会遇到尝试来回转换的错误(例如,将字符串&#34; hello&#34;转换为byte,或者将整数4,235转换为字节)。您最有可能希望通过适当的验证来制作这些方法,如果转换失败,可能会抛出异常。

答案 2 :(得分:1)

这在C#中是不可能的,如下图所示:

你的程序甚至无法编译。所以你需要给第二个属性另一个名字。