2017-09-25 17 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に設定するメソッドが必要です。

編集: 私の問題の懸念事項フィールド: プライベートSystem.DateTime endDateTimeField; プライベートbool endDateTimeFieldSpecified;

private System.DateTime secondDriverStartField; プライベートbool secondDriverStartFieldSpecified;

private System.DateTime secondDriverEndField; プライベートbool secondDriverEndFieldSpecified;

おそらく私はこのようなものを使用することができます。

パブリック静的ボイドSetProperyValue(オブジェクトobj) { IEnumerableを小道具= obj.GetTypeを()GetPropertiesの() .Where(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:私の質問にお答えできますか?コンパイル時にプロパティの名前を知っていますか?それ以外の場合は、関連するvalue-propertyのタイプを見つけることは困難です。 'Int'型(' System.Int32'です)がないからです。したがって、略称を実際の.NETタイプに変換するための辞書も必要です。 –

答えて

0

[OK]を私は解決策を見つけた:

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型と日時がNULL可能にするために:

public class MyClass 
{ 
    public int? MyInt { get; set; } 
    public bool MyIntSpecified => MyInt.HasValue; 
    public DateTime? MyDateTime { get; set; } 
    public bool MyDateTimeSpecified => MyDateTime.HasValue; 
} 
関連する問題