Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#基于属性的条件_C#_Object - Fatal编程技术网

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杰夫沃特金斯:这是一致的。但是,是的,对于自动财产,我不知道如何实现它。