C#基于属性的条件
我有以下课程C#基于属性的条件,c#,object,C#,Object,我有以下课程 class ClassA : SuperClass { } class ClassB : SuperClass { } class ClassC : SuperClass { } class SuperClass { int Id { get; set; } string Property1 { get; set; } string Property2 { get; set; } List<string> Property3 { get;
class ClassA : SuperClass { }
class ClassB : SuperClass { }
class ClassC : SuperClass { }
class SuperClass
{
int Id { get; set; }
string Property1 { get; set; }
string Property2 { get; set; }
List<string> Property3 { get; set; }
}
ClassA类:超类{}
类B:超类{}
类C:超类{}
类超类
{
int Id{get;set;}
字符串属性1{get;set;}
字符串属性2{get;set;}
列表属性3{get;set;}
}
当满足条件时,我必须重写任何类(a、B、C)中的一个、两个或所有属性,并且我必须知道这些属性被重写了,哪些属性在哪里。
所以我创建了这个应该由超类实现的接口
public interface IOverride
{
string OverrideProperty1 { get; set; }
string OverrideProperty2 { get; set; }
List<string> OrderedProperty3 { get; set; }
}
公共接口越界
{
字符串重写属性1{get;set;}
字符串重写属性2{get;set;}
列表OrderedProperty3{get;set;}
}
我如何知道属性是否被重写,而不必为每个属性创建布尔值。
还是我应该换一种方式
编辑
ClassA、ClassB和ClassC数据来自特定的源,对于每个对象,我从另一个源获取信息。如果新源有值,我需要存储它们并覆盖原始值
差不多
var dataList = GetClassesData() as List<SuperClass>;
var newData = GetNewData() as object[];
foreach (var data in dataList)
{
if (newData.Contains(o => o.Id == data.Id))
{
data.Property1 = newData[Id].Property1;
data.Property2 = newData[Id].Property2;
data.Property3 = newData[Id].Property3;
}
}
var dataList=GetClassesData()作为列表;
var newData=GetNewData()作为对象[];
foreach(数据列表中的var数据)
{
if(newData.Contains(o=>o.Id==data.Id))
{
data.Property1=newData[Id].Property1;
data.Property2=newData[Id].Property2;
data.Property3=newData[Id].Property3;
}
}
重写本身并不是有条件的,可以有条件的是从重写类返回的属性的值 这应该能帮到你
if(typeof(ClassA).GetMethod("Property1").DeclaringType == typeof(SuperClass)){
//This method was overridden
}
如果我正确理解你编辑的问题,你可以这样说:
public interface IOverride
{
string StandardProperty1 { get; set; }
string StandardProperty2 { get; set; }
List<string> StandardProperty3 { get; set; }
string OverrideProperty1 { get; set; }
string OverrideProperty2 { get; set; }
List<string> OrderedProperty3 { get; set; }
}
class ClassA : SuperClass { }
class ClassB : SuperClass { }
class ClassC : SuperClass { }
class SuperClass : IOverrideProperty
{
string StandardProperty1 { get; set; }
string StandardProperty2 { get; set; }
List<string> StandardProperty3 { get; set; }
string OverrideProperty1 { get; set; }
string OverrideProperty2 { get; set; }
List<string> OrderedProperty3 { get; set; }
string Property1
{
get
{
if (condition)
return OverrideProperty1;
else
return StandardProperty1;
}
set
{
if (condition)
OverrideProperty1 = value;
else
StandardProperty1 = value;
}
//Same for Property2 and 3
}
公共接口越界
{
字符串StandardProperty1{get;set;}
字符串StandardProperty2{get;set;}
列出StandardProperty3{get;set;}
字符串重写属性1{get;set;}
字符串重写属性2{get;set;}
列表OrderedProperty3{get;set;}
}
类ClassA:超类{}
类B:超类{}
类C:超类{}
类超类:IOverrideProperty
{
字符串StandardProperty1{get;set;}
字符串StandardProperty2{get;set;}
列出StandardProperty3{get;set;}
字符串重写属性1{get;set;}
字符串重写属性2{get;set;}
列表OrderedProperty3{get;set;}
字符串属性1
{
得到
{
如果(条件)
返回覆盖属性1;
其他的
返回标准属性1;
}
设置
{
如果(条件)
OverrideProperty1=值;
其他的
标准财产1=价值;
}
//物业2和物业3的情况相同
}
您现在可以设置这两个属性,并且您的条件将决定返回或设置哪个属性。覆盖(用C#术语)从来都不是有条件的——或者更确切地说,它在执行时不是有条件的,而是在编译时。如果你能更详细地说明你的意思和你试图实现的目标,这将非常有帮助。一个更具体的问题示例会有所帮助。我想你是说,对于这种逻辑,你不能使用自动属性,y杰夫沃特金斯:这是一致的。但是,是的,对于自动财产,我不知道如何实现它。