Используйте приведенный ниже код: -
TimeUnit Enum
Следующее выражение использует перечисление TimeUnit (Java 5 и более поздние версии) для преобразования из наносекунды до секунд:
public static void main (String[] args) {
long start = System.nanoTime();
//some try with nested loops
long end = System.nanoTime();
long elapsedTime = end - start;
System.out.println("elapsed: " + elapsedTime + "nano seconds\n");
//convert to seconds
TimeUnit seconds = new TimeUnit();
System.out.println("which is " + TimeUnit.NANOSECONDS.toSeconds(elapsedTime) + " seconds");
}}
Это похоже на оба из типов, Вы заботитесь о реализации о тех же двух свойствах. В этом случае то, что Вы хотите сделать, определяют интерфейс для тех свойств:
public interface IMyInterface
{
public Foo Property1 {get; set;}
public Bar Property2 {get;set;}
}
Затем удостоверьтесь, что каждый из Ваших классов говорит компилятору, что они реализуют тот новый интерфейс. Наконец, используйте общий метод с аргументом типа, который ограничивается к тому межтузу:
private void FillObject<T>(T MainObject, Foo Arg1, Bar Arg2)
where T : IMyInterface
{
MainObject.Property1 = Arg1;
MainObject.Property2 = Arg2;
}
Обратите внимание, что даже с дополнительным кодом для объявления интерфейса эти отрывки все еще заканчиваются короче, чем любой из отрывков, которые Вы отправили в вопросе, и этот код намного легче расширить, если количество типов Вы заботитесь об увеличениях.
Вы сможете внести изменения в SomeClassType1, SomeClassType2 и т.д.? Если да затем я предложу, чтобы Вы создали интерфейс, содержащий Вашу общую собственность, и затем преобразовали тип к этому интерфейсу в FillObject()
установить свойства.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SO566510
{
interface IMyProperties
{
int Property1 { get; set; }
int Property2 { get; set; }
}
class SomeClassType1 : IMyProperties
{
public int Property1 { get; set; }
public int Property2 { get; set; }
}
class SomeClassType2 : IMyProperties
{
public int Property1 { get; set; }
public int Property2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
var obj1 = new SomeClassType1();
var obj2 = new SomeClassType2();
FillObject(obj1, 10, 20);
FillObject(obj2, 30, 40);
}
private static void FillObject(IMyProperties objWithMyProperties
, int arg1, int arg2)
{
objWithMyProperties.Property1 = arg1;
objWithMyProperties.Property2 = arg2;
}
}
}
По существу то, что Вы делаете здесь, пишет оператор переключения на основе типа fo объект. Нет никакого по сути хорошего способа сделать это кроме Вашего первого примера (который утомителен в лучшем случае).
Я записал маленькую платформу для включения типов, который делает синтаксис немного более кратким. Это позволяет Вам писать код как следующее.
TypeSwitch.Do(
sender,
TypeSwitch.Case<Button>(
() => textBox1.Text = "Hit a Button"),
TypeSwitch.Case<CheckBox>(
x => textBox1.Text = "Checkbox is " + x.Checked),
TypeSwitch.Default(
() => textBox1.Text = "Not sure what is hovered over"));
Запись в блоге: http://blogs.msdn.com/jaredpar/archive/2008/05/16/switching-on-types.aspx
Вместо того, чтобы пытаться бросить, возможно, Вы могли попытаться установить свойства с помощью отражения.
Некоторые идеи:
private void FillObject(Object MainObject, Foo Arg1, Bar Arg2)
{
Type t = MainObject.GetType();
t.GetProperty("Property1").SetValue(MainObject, Arg1, null);
t.GetProperty("Property2").SetValue(MainObject, Arg2, null);
}
Я динамически вывожу объекты с помощью Reflection в приложении MVC ASP.NET. В основном я перечисляю свойства класса, нахожу соответствующее значение в хранилище данных и динамически вывожу значение и присваиваю его экземпляру объекта. Посмотреть мою запись в блоге Динамическое приведение с помощью .NET