C#-初始化一个变量时不知道它将是什么
本文关键字:不知道 是什么 变量 一个 初始化 C#- | 更新日期: 2023-09-27 18:00:32
我的数据库中有两个不同的表,每个表都根据它们的"SortOrder"显示给用户。我已经编写了两个函数,它们取一行(或实体),并将其排序顺序与最接近的行(向上或向下,取决于正在执行的函数)交换。我需要使这些函数适用于两个不同的表,这取决于事件发生的位置(具有相同功能的多个网格视图)。这是我到目前为止所拥有的(同样,有一个几乎相同的功能可以向下移动,但我不会发布,因为这是多余的):
protected void moveUp(String ValId, String dbName)
{
int ValueId = Convert.ToInt32(ValId);
DataModel.DataAccess.Entities dc = new DataModel.DataAccess.Entities();
if (dbName.ToLower() == "table1")
{
DataModel.DataAccess.Table1 currentValue = dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId);
}
else if (dbName.ToLower() == "table2")
{
DataModel.DataAccess.Table2 currentValue = dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId);
}
try
{
//make the change and update the database and gridview
}
catch (InvalidOperationException)
{
}
}
显而易见的问题是,我需要在if语句之前启动currentValue变量,否则它可能永远不会被声明,因此函数的其余部分(使用currentValue变量)将无法工作。
我的问题是:如果我还不确定它会是什么,我应该如何在if语句之前初始化变量?我认为这可能可行,但它说我仍然需要初始化它("隐式类型的局部变量必须初始化"):
var currentValue; //this is the line where I get the error message above
if (dbName.ToLower() == "table1")
{
currentValue = (DataModel.DataAccess.Table1)dc.Table1.Single(table1item => table1item.Table1ItemId == ValueId);
}
else if (dbName.ToLower() == "table2")
{
currentValue = (DataModel.DataAccess.Table2)dc.Table2.Single(table2item => table2item.Table2ItemId == ValueId);
}
[EDIT]更改了标题,使其更准确地反映我的问题
在C#中,所有类型都需要一个类型。如果您的Table#
类型扩展了DataModel.DataAccess.Table
,请使用以下内容:
DataModel.DataAccess.Table currentValue;
否则,你需要找到一个共同的基类(对象是所有基类的曾祖父)。
object currentValue;
由于您没有初始化currentValue
,编译器无法知道您所说的var
是什么类型。这就是为什么你会得到例外。
附录:也许,您可以使用一个通用方法,而不是传入表的名称,比如:
moveUp(dc.Table1, item => item.Table1Key, "george");
void moveUp<T> (IEnumerable<T> table, Func<T,string> keySelector, string ValId)
{
T currentValue = table.Single(item => keySelector(item) == ValueId);
try
{
//make the change and update the database and gridview
}
catch (InvalidOperationException)
{
}
}
使用类型对象代替var,尽管我可能会重写整个过程并使用一致(和标准)的命名约定。
所以:
object currentValue = null;
您可以尝试编写每个实体使用的接口和接受该接口的函数。
public interface ISortableEntity
{
int ID { get; set; }
int SortOrder { get; set; }
}
public class DataFunctions
{
public static void MoveUp(string dbName, int valID)
{
var db = //Get your context here;
List<KeyValuePair<string, object>> keys = new List<KeyValuePair<string, object>>();
keys.Add(new KeyValuePair<string, object>("ID", valID));
ISortableEntity entity = db.GetObjectByKey(new System.Data.EntityKey(dbName, keys)) as ISortableEntity;
if (entity != null)
{
entity.SortOrder += 1;
}
db.SaveChanges();
}
}
你不知道变量的类型吗,这就是为什么你隐式地声明它('var',而不是'int')?
您不必初始化显式类型——隐式类型需要它,因为它们通过给定的值来计算类型。
解决方案是接口。您的表1和表2类应该实现一个具有CurrentValue属性的接口(如ISortalTable或您想调用它的任何接口)。Table1的CurrentValue属性实现将返回Table1的正确结果,Table2的CurrentValue特性将返回Table2的正确结果。然后,排序函数可以与实现ISortalInterface的任何类一起使用,并与相应对象的CurrentValue属性一起使用。