2017-09-25 36 views
0

我有一个Java Web服务,我在.Net中实现一个客户端。现在我遇到了类似这样的问题:Java Webservice and .NET client dropping DateTime objects。 我知道如何设置一个标志,当我有一个值属性,但我需要一个方法,将自动设置该标志。例如(我删除的属性,以增加可读性):方法什么根据属性值设置标志

public class MyClass 
{ 
    private System.DateTime endDateTimeField; 

    private bool endDateTimeFieldSpecified; 

    private System.DateTime startDateTimeField; 

    private System.DateTime firstDriverStartField; 

    private System.DateTime firstDriverEndField; 

    private System.DateTime secondDriverStartField; 

    private bool secondDriverStartFieldSpecified; 

    private System.DateTime secondDriverEndField; 

    private bool secondDriverEndFieldSpecified; 

    private string exciseNumberField; 

    private double gasCounterEndField; 

    private double gasCounterStartField; 

    private string idField; 

    private double mileageStartField; 

    private double mileageEndField; 

    private obtcStatus obtcStatusField; 

    private string secondDriverField; 
} 

与简单类型的所有财产都自动添加“myProperty的” +指定。 我需要一个方法来检查整个对象,或者它是否具有MyProperty/MyPropertySpecified对,并且如果MyProperty设置为非null值,则将MyPropertySpecified标志设置为true。

编辑: 我的问题关注字段: private System.DateTime endDateTimeField; private bool endDateTimeFieldSpecified;

private System.DateTime secondDriverStartField; private bool secondDriverStartFieldSpecified;

private System.DateTime secondDriverEndField; private bool secondDriverEndFieldSpecified;

大概我可以使用这样的事情:

公共静态无效SetProperyValue(obj对象) { IEnumerable的道具= obj.GetType()的GetProperties() 。凡(X => x.Name = =“endDateTimeField”|| x.Name ==“endDateTimeFieldSpecified”);

 if (props?.Count() == 2 && 
      props.FirstOrDefault(x => x.Name == "endDateTimeField").GetValue(obj) != null)    
      props.FirstOrDefault(x => x.Name == "endDateTimeFieldSpecified").SetValue(obj, true);    
    } 

但我不想在刚性

+3

我不明白如果你需要的方式不知道属性名称,那么你只能使用反射。 –

+0

你到目前为止尝试过什么? – Sefe

+0

@Newer:你能回答我的问题吗?你知道编译时的属性名称吗?否则,很难找到相关的价值属性的类型。因为没有'Int'类型(它是'System.Int32')。所以你还需要一个字典来将你的缩写名称翻译成真正的.NET类型。 –

回答

0

好吧,我找到解决办法:

public static void SetPropertyValues(object obj) 
    { 
     IEnumerable<PropertyInfo> props = obj.GetType().GetProperties().Where(x => x.Name.EndsWith("Specified")); 
     List<Tuple<string, string>> propertyList = new List<Tuple<string, string>>(); 

     foreach (var item in props)    
      propertyList.Add(new Tuple<string, string>(item.Name.Replace("Specified",""), item.Name));    

     foreach (var item in propertyList)   
      setPropertyValue(obj, item.Item1, item.Item2);    
    } 

    private static void setPropertyValue(object obj, string propertyName, string flagName) 
    { 
     IEnumerable<PropertyInfo> props = obj.GetType().GetProperties() 
      .Where(x => x.Name == propertyName || x.Name == flagName); 

     var propValue = props.FirstOrDefault(x => x.Name == propertyName).GetValue(obj); 

     if (props?.Count() == 2 && propValue != null && checkMinValue(propValue.GetType(), propValue)) 
      props.FirstOrDefault(x => x.Name == flagName).SetValue(obj, true); 
    } 

    private static bool checkMinValue(Type type, object obj) 
    { 
     if (type.Name == "DateTime") 
      return Convert.ToDateTime(obj) != DateTime.MinValue; 
     if (type.Name == "Double") 
      return Convert.ToDouble(obj) != double.MinValue; 
     if (type.Name == "Int32") 
      return Convert.ToInt32(obj) != Int32.MinValue; 

     return true; 
    } 

是的,我知道它可以更好地写,但现在我认为这将是工作:)

-1

我不知道你到底想要什么用途属性名称(请注明更好你的问题),但我想是这样的(请注意,您有让你的INT和日期时间为空的,如果你想检查它们的空的,因为他们都是结构):

public class MyClass 
{ 
    public int? MyInt { get; set; } 
    public bool MyIntSpecified => MyInt.HasValue; 
    public DateTime? MyDateTime { get; set; } 
    public bool MyDateTimeSpecified => MyDateTime.HasValue; 
}