2016-11-27 68 views
-1

我确定C#中的问题“类型”。C#重新定义类中的变量

假设我有一个工作名称为“item”的类。 这个类有一个字段,如“变量”。 此字段应与我程序中某个元素的字段匹配,例如布尔型int16,int32,int64,double,uint,uint16。

有没有可能在依赖需求中重新定义变量的类型? 或者还有其他解决这个问题的方法吗?

我认为这个变量的定义是var或object,然后将它投影到给定的类型上。

问题是,分配值时检查的后面没有超出范围?

+1

任何问题的项目''类型?我很难理解你的要求。 – jdphenix

+0

请显示一些如何使用此变量的示例代码。 – CodeCaster

+0

你应该研究泛型 – Jonesopolis

回答

0

您可以使用泛型或dynamic,具体取决于您想要如何使用Item

要使用泛型方法,定义Item这样:

class Item<T> { 
    public T Variable { get; set; } 
} 

当你想其Variable是一个int的项目,这样做:

var intItem = new Item<int>() 
// you can set the Variable property to an int now! 
intItem.Variable = -1; 

当你想其Variable项目是一个字节,这样做:

var byteItem = new Item<byte>() 
// you can set the Variable property to a byte 
byteItem.Variable = 10; 

而且等等......

这种方法的一个特点是,物品的Variable的类型不能改变,一旦该物品被创建。所以这是不可能的:

intItem.Variable = "Hello"; 

如果你想改变它的类型到别的东西,而无需创建一个新的项目,你应该使用动态变量:

class Item { 
    public dynamic Variable {get; set;} 
} 

你现在可以做这样的事情:

var myItem = new Item(); 
myItem.Variable = "Hello"; 
myItem.Variable = 10; 

这是基本相同的定义Variableobject,但它节省您的时间object和铸件之间所需的类型。

而关于检查值是否超出范围的担心,如果使用dynamic,则可能有点难以检查它。但是我做了这个小测试,发现当值溢出,它只会环绕:

var item = new Item(); 
item.Variable = byte.MaxValue; 
item.Variable++; 
Console.WriteLine(item.Variable); // prints 0 
+0

谢谢,就是这样。它简单易用。问候 。 –

+0

@MichałGałkowski如果您认为我的回答可以回答您的问题,请考虑接受它! – Sweeper

-1

您可以使用泛型。当您使用新类型创建对象时,它将自动在后面的代码中创建类定义。

public class GenericClass<T> 
{ 
    public T MyProperty { get; set; } 

    public void TestMethod() 
    { 
     Console.WriteLine(MyProperty.ToString()); 
    } 
} 

然后,你可以用它来与不同类型的

 var myIntClass = new GenericClass<int>(); 
     var myStringClass = new GenericClass<string>(); 
     myIntClass.MyProperty = 1; 
     myStringClass.MyProperty = "test"; 

     myIntClass.TestMethod(); 
     myStringClass.TestMethod(); 

你也可以把约束,使通用类必须实现一个特定的接口,是一流的,具有构造函数。 public interface IPrintable void Print(); }

public class GenericClassWithConstraint<T> where T : IPrintable 
{ 
    public T MyProperty { get; set; } 

    void Print() 
    { 
     MyProperty.Print(); 
    } 
} 

您还可以检查出新的关键字动态。它将允许您在运行时处理对象

+1

解释这是如何工作的,以及为什么它回答OP的问题。 –

+0

它确实解决了“或者是否有任何其他方法来解决这个问题?”的概念,但是并没有真正解决“问题在于分配值的检查时间稍后没有超出范围?考虑..这是实际问题,需要更多的澄清由OP解决..我怀疑'名单>'将是一个范围,但..但是还没有。 –