C#: Кастинг типов динамично

Используйте приведенный ниже код: -

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"); 
}}

6
задан MK_Dev 19 February 2009 в 18:28
поделиться

7 ответов

Это похоже на оба из типов, Вы заботитесь о реализации о тех же двух свойствах. В этом случае то, что Вы хотите сделать, определяют интерфейс для тех свойств:

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;
}

Обратите внимание, что даже с дополнительным кодом для объявления интерфейса эти отрывки все еще заканчиваются короче, чем любой из отрывков, которые Вы отправили в вопросе, и этот код намного легче расширить, если количество типов Вы заботитесь об увеличениях.

15
ответ дан 8 December 2019 в 02:20
поделиться

Вы сможете внести изменения в 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;
        }
    }
}
7
ответ дан 8 December 2019 в 02:20
поделиться

По существу то, что Вы делаете здесь, пишет оператор переключения на основе типа 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

9
ответ дан 8 December 2019 в 02:20
поделиться

Вместо того, чтобы пытаться бросить, возможно, Вы могли попытаться установить свойства с помощью отражения.

2
ответ дан 8 December 2019 в 02:20
поделиться

Некоторые идеи:

  1. Имейте оба типа, наследовались тому же типу, которые имеют общую собственность
  2. Имейте обе реализации типов тот же интерфейс, которые имеют общую собственность
  3. Используйте отражение для установки свойств вместо того, чтобы установить их непосредственно (это, вероятно, более ужасно, чем это стоит),
  4. Используйте новую динамическую функцию, я не попробовал это, но похож на него, мог бы решить Вашу проблему
3
ответ дан 8 December 2019 в 02:20
поделиться
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);
}
4
ответ дан 8 December 2019 в 02:20
поделиться

Я динамически вывожу объекты с помощью Reflection в приложении MVC ASP.NET. В основном я перечисляю свойства класса, нахожу соответствующее значение в хранилище данных и динамически вывожу значение и присваиваю его экземпляру объекта. Посмотреть мою запись в блоге Динамическое приведение с помощью .NET

0
ответ дан 8 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: