【问题标题】:C# interchangeable propertiesC# 可互换属性
【发布时间】:2012-08-11 12:17:43
【问题描述】:

我正在尝试创建一种属性的替代品,它接受多种类型作为输入/输出。

这是一个丑陋的解决方案的一些伪代码:

http://pastebin.com/gbh4SrZX

基本上我有一段数据,我需要能够为其分配多种类型,并做出相应的反应。我有一些要操作的数据,我需要有效的方法来管理在需要时从文件名加载它们,同时保持相同的代码,如果我正在操作数据,那已经加载了。

这太棒了:

SomeDataClass data1 = new SomeDataClass();
SomeDataClass data2 = new SomeDataClass();

data1.Data = "somefile.dat";
data2.Data = data1.Data;

而 SomeDataClass.Data 不是字符串类型。

【问题讨论】:

  • 你选错了语言
  • @Luis 怎么会这样?不一定遵循

标签: c# types properties weakly-typed


【解决方案1】:

您是否考虑过使用dynamic

class A {
    public dynamic property1 { get; set; }
    public dynamic property2 { get; set; }
}

class Program {

    static void Main(string[] args) {

        A a = new A();
        A b = new A();

        a.property1 = "hello world!";
        b.property2 = a.property1;

        Console.WriteLine(b.property2); // writes "hello world!"
    }
}

【讨论】:

  • 认为这错过了问题的主旨,即它希望对不同的对象类型进行不同的处理。坦率地说,dynamic 在这里没有添加任何 object 未完成的内容。
  • 也许我理解错了。但是,根据我对问题的理解(想要为属性分配任何值),动态将允许访问类型方法、属性等。而对象需要显式转换才能提供此功能。如果我误解了这个问题,我深表歉意。
【解决方案2】:

您可以使用隐式转换运算符完成大部分操作,即

class SomeDataClass {
    public SomeData Data {get;set;}
}
class SomeData {
    static SomeData Load(string path) {
        return new SomeData(); // TODO
    }
    public static implicit operator SomeData(string path)
    {
        return Load(path);
    }
}
static class Program {
    static void Main()
    {
        SomeDataClass data1 = new SomeDataClass();
        SomeDataClass data2 = new SomeDataClass();

        data1.Data = "somefile.dat"; // this is a load
        data2.Data = data1.Data; // this is not a load
    }
}

但是!坦率地说,我认为将操作明确化更可取:

class SomeDataClass {
    public SomeData Data {get;set;}
}
class SomeData {
    public static SomeData Load(string path) {
        return new SomeData(); // TODO
    }
}
static class Program {
    static void Main()
    {
        SomeDataClass data1 = new SomeDataClass();
        SomeDataClass data2 = new SomeDataClass();

        data1.Data = SomeData.Load("somefile.dat");
        data2.Data = data1.Data;
    }
}

【讨论】:

    【解决方案3】:

    不确定您真正要解决的问题是什么,但在我看来,您最好使用 byte[],处理从磁盘或从磁盘加载的数据流其他地方。

    还可以考虑只对通用接口进行编码,而不是使用动态和对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 2016-03-24
      • 2011-03-17
      • 2011-01-29
      相关资源
      最近更新 更多