我需要使用属性位置或任何其他类似方式访问Generic类型的属性。
示例:
class model
{
int intValue;
string stringValue;
public model(int a,string b){
this.intValue = a;
this.stringValue= b;
}
}
public class baseClass<T>
{
public string value;
public void process(T param)
{
value = param.Getproperty[0].ToString();
}
}
public class derivedClass : baseClass<model>
{
Console.WriteLine("Converted value:" +process(new model(1,"test")));
//Do something
}
我的基类实际上是一个通用库,它执行一些简单的常见任务。
答案 0 :(得分:1)
您需要定义一个公共接口,当前接口设置为Object,因此无法访问任何不是Object成员的任何内容,这是通过where关键字
完成的。这可以使用实际接口
明确完成public interface IIndexedProperty
{
object Getproperty(int index);
}
public class model:IIndexedProperty
{
int intValue;
string stringValue;
public object Getproperty(int index)
{
//select property by index
}
}
public class baseClass<T>
where T:IIndexedProperty
{
public T item;
item.Getproperty(0); // access intValue
item.Getproperty(1); // access stringValue
}
另一种选择是使用模型作为您的界面
public class model
{
int intValue;
string stringValue;
}
public void baseClass<T>
where T:model
{
public T item;
item.intValue; // access intValue
item.stringValue; // access stringValue
}
最后一个选项是反射
typeof(T).GetProperties();
答案 1 :(得分:1)
我可以建议另一种方法吗?
interface TwoProperties {
object GetProperty1();
object GetProperty2();
}
class Model : TwoProperties {
int intValue;
stringStringValue;
public override object GetProperty1() {
return intValue;
}
public override object GetProperty2() {
return stringValue;
}
}
然后使用someModel.GetProperty1()
作为例子。
interface SomeProperties {
object[] GetProperties();
}
class Model : SomeProperties {
int intValue;
stringStringValue;
public override object[] GetProperties() {
return new object[] { intValue, stringValue };
}
}
然后使用someModel.GetProperties()[0]
,例如。
答案 2 :(得分:0)
您可以实施property indexer:
示例代码:
public class TestIndexer
{
public string x;
public int y;
public object this[int i]
{
get
{
switch (i)
{
case 1:
return y;
case 2:
return x;
default:
return "";
// return the property you want based on index i
}
}
}
}
TestIndexer t = new TestIndexer();
t.y = 22;
object indexValue = t[1]; //22