读书人

怎么实现类的同名成员属性静态和动态重

发布时间: 2012-12-14 10:33:08 作者: rapoo

如何实现类的同名成员属性静态和动态重载
就是想要下面这段代码的效果(我知道C#不支持,只是希望大家能提供一种变通的方法达到这种效果):


public class tblProduct
{
public int ProductID { get; set; }
public static string ProductID
{
get { return "tblProduct.ProductID"; }
}
public string ProductName { get; set; }
public static string ProductName
{
get { return "tblProduct.ProductName"; }
}
}

[最优解释]
tblProduct p = GetAProduct() ?? new tblProduct() { ProductID = "tblProduct.ProductID", ProductName = "tblProduct.ProductName" };
相当于
tblProduct p = GetAProduct();
if (p == null)
{
p = new tblProduct();
p.ProductID = "tblProduct.ProductID";
p.ProductName = "tblProduct.ProductName";
}


[其他解释]

tblProduct t1 = new tblProduct(){ProductName = "t1"};
tblProduct t2 = new tblProduct(){ProductName = "t2"};
string name = tblProduct.ProductName; // t1 or t2 ?

[其他解释]
为啥要用同名的呢?
public class tblProduct
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public struct Product
{
public static string ProductID = "tblProduct.ProductID";
public static string ProductName = "tblProduct.ProductName";
}
}
[其他解释]
我想用类的实例来存取数据,没有实例时,则只返回成员的名称。
你这个想法估计不是很好。
用类的实例调用时怎么可能返回静态属性呢?
比如下面的代码:
tblProduct tp = new tblProduct();
string pName = tp.ProductName;//调用实例需要对象引用,而静态属性要直接用类名来调用。
如果这个引用是null的话,直接就报错了。就算你上面的代码编译通过,也不可能调用到静态属性的。
[其他解释]

class daoContext<T>
{
public static T getModel(T pototype)
{
PopulateDBTo(prototype);
return prototype;
}
}

tblUser user = daoContext.getModel(new tblUser(){UserID = 100} );

[其他解释]
哦,我错了,虽然上面的方法可以,不过似乎不是想要的东西,你仔细看了一下,其实你要得好像就是对象的元数据描述啊,如果是元数据描述,就不需要想了,自己扩一个geiMeta的静态方法,直接用反射把元数据描述提取出来就是了


[其他解释]
额,直接手段做不到,我通常是采用一个静态方法new一个实例出去

这样你var obj=tblProduct.NewInstance();就可以了,当然如果想更简单点,自己用expression<func<T,T>>封一到也可以
[其他解释]
或者你在你的属性上直接加上 特性描述也可以
[其他解释]
就连函数的重载都不支持这样的——通过返回值不同来重载,你想让属性支持,根本不可能?任何语言都没有这种异想天开的功能。
[其他解释]
故意在很基本的概念上弄个自相矛盾的概念需求出来,这不可能有什么解答。
[其他解释]
如果你能够从实际出发,更多地描述一点需求背景,那么我想很多人都能告诉你。至少会给你一个什么“Singleton“之类的名词儿。

还是多描述业务需求,避免“过分技术化”。
[其他解释]

引用:
C# code?123tblProduct t1 = new tblProduct(){ProductName = "t1"};tblProduct t2 = new tblProduct(){ProductName = "t2"};string name = tblProduct.ProductName; // t1 or t2 ?

谢谢你的回复!
我想用类的实例来存取数据,没有实例时,则只返回成员的名称。
具体地说,当类被创建时,它负责装载数据实体的单行数据,当没有被创建时,它只是描述数据实体的结构。
[其他解释]
我原来使用了两个类,一个用于描述数据实体的结构,一个用于装载数据,但实体太多时感觉不是太好,要是能在同一个类里实现就好了。

[其他解释]
引用:
为啥要用同名的呢?
public class tblProduct
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public struct Product
{
……

主要是想让调用者的代码看上去简洁、优雅一些。
[其他解释]
如果能放在同一个类里,就可以实现以下代码了:
tblUser user = daoContext<tblUser>.getModel(tblUser.UserID=100);
[其他解释]
上面少写了一个等号,等号运算符被重载了的,用于生成条件。
[其他解释]
引用:
就连函数的重载都不支持这样的——通过返回值不同来重载,你想让属性支持,根本不可能?任何语言都没有这种异想天开的功能。

嗯,我知道,可两年多就是放不下这个想法。
[其他解释]
引用:
C# code?12345678910class daoContext<T>{ public static T getModel(T pototype) { PopulateDBTo(prototype); return prototype; }} tblUser user = daoContext.getModel(new tblUser……

能给一个可行的例子吗?万分感谢!!!
[其他解释]
引用:
C# code
?



1

tblProduct p = GetAProduct() ?? new tblProduct() { ProductID = "tblProduct.ProductID", ProductName = "tblProduct.ProductName" };相当于
tblProduct p = GetAProduct();


C# code
……


谢谢版主,我想实现静态时成员属性表示结构,动态时(被实例化)成员属性表示数据,上面代码实现了啊。我现在想大家能提供一个变通的办法来达到这种效果,实在不行的话,还是用原来的两个类了。
[其他解释]
引用:
如果你能够从实际出发,更多地描述一点需求背景,那么我想很多人都能告诉你。至少会给你一个什么“Singleton“之类的名词儿。

还是多描述业务需求,避免“过分技术化”。

嗯,谢谢!
我现在基本想通了。
这个想法的背景就是实现完全OOP的数据库操作,包括条件,我不能像微软可以在IDE级别上提供OOP、智能感知和编译纠错等技术支持以提高LINQ代码的易用性和健壮性,也不喜欢HQL这类半OOP的方式,因此自己写了一个框架,已成功应用到公司的4个项目中,大大加快了开发进度,不过有些地方不太理想,因此想改进一下。
这两天我一直反思是不是自己方向有些问题,现在基本想明白了。错在当初不该偷懒,直接把Entity当作D使用(因为4个项目都是MIS,因此大我时候可以直接把Entity当作DTO使用),现在分开了,可读性、可扩展性和可维护性都得到了提高。比如一个DTO中含有两个成员表示电话号码,前者是区号,后面是地区电话,而Entity可以只有一个成员,这样就可以在数据层屏蔽数据库设计细节了,而且还可以让Entity在数据层生成条件片断,让DTO则在业务层和视图层实现正常的逻辑判断,而不必像当初那样动态断言。
[其他解释]
引用:
或者你在你的属性上直接加上 特性描述也可以

谢谢,你是最理解我思路的。特性描述加反射也是最可行的方式,不过我觉得最好放在框架内部,毕竟团队成员的水平参差不齐,让每个成员都使用反射的话,一是框架不友好,二是质量控制上也不好管理,我现在准备改变框架的内部实现,不在纠结于是否可以让类成员在静动态有不同表现了。

读书人网 >C#

热点推荐